Структуры и указатели

У меня есть несколько вопросов о структурах и указателях

Для этой структуры:

typedef struct tNode_t {
    char *w;
} tNode;

Почему, если я хочу изменить / узнать значение * w, которое мне нужно использовать? t.w = "asdfsd" вместо t->w = "asdfasd"?

И я успешно скомпилировал это, не имея t.w = (char *) malloc(28*sizeof(char));в моем тестовом коде есть причина, по которой tt не нужен?

Образец основного:

int main()
{
    tNode t;
    char w[] = "abcd";
    //t.word = (char *) malloc(28*sizeof(char));
    t.word = w;
    printf("%s", t.word);
}

Благодарю.

4 ответа

Решение

t->w это сокращение для (*t).w т.е. имеет смысл использовать стрелку, только если t это указатель на структуру

Кроме того, поскольку назначенная вами строка жестко запрограммирована (то есть определяется во время компиляции), нет необходимости динамически выделять ее память во время выполнения.

Взгляните на этот учебник: http://pw1.netcom.com/~tjensen/ptr/ch5x.htm

struct tag {
char lname[20];      /* last name */
char fname[20];      /* first name */
int age;             /* age */
float rate;          /* e.g. 12.75 per hour */
};

Итак, мы знаем, что наш указатель будет указывать на структуру, объявленную с использованием тега struct. Мы объявляем такой указатель с объявлением:

struct tag *st_ptr;

и мы указываем на нашу примерную структуру:

st_ptr = &my_struct;

Теперь мы можем получить доступ к данному члену, сняв ссылку на указатель. Но как отменить ссылку на указатель на структуру? Хорошо, учтите тот факт, что мы могли бы использовать указатель, чтобы установить возраст сотрудника. Мы бы написали:

(*st_ptr).age = 63;

Посмотри на это внимательно. Он говорит: замените это в скобках на то, на что указывает st_ptr, то есть на структуру my_struct. Таким образом, это сводится к тому же, что и my_struct.age.

Тем не менее, это довольно часто используемое выражение, и разработчики C создали альтернативный синтаксис с тем же значением:

st_ptr->age = 63;

Почему, если я хочу изменить / узнать значение *w, мне нужно использовать tw = "asdfsd" вместо t->w = "asdfasd"?

Если твой t это указатель, вам нужно использовать t->w, Иначе вы должны использовать t.w,

в моем тестовом коде есть причина, по которой tt не нужен?

В вашем коде вы уже установили свой t.word указать на область хранения вашего char w[] = "abcd";, Так что вам не нужно malloc немного памяти для вашего t.word,

Еще один пример, где malloc необходимо это:

tNode t;
t.word = (char *) malloc(28*sizeof(char));
strcpy(t.word, "Hello World");
printf("%s", t.word);

Почему, если я хочу изменить / узнать значение *w, мне нужно использовать tw = "asdfsd" вместо t->w = "asdfasd"?

t это tNode, а не указатель на tNode, так . является подходящим средством доступа.

И я успешно скомпилировал это без tw = (char *) malloc(28*sizeof(char)); в моем тестовом коде есть причина, по которой tt не нужен?

Это не нужно, потому что "abcd" все еще в области, так w могу просто указать на это. Если ты хочешь w чтобы указать на постоянное содержимое, управляемое памятью, ему придется выделить собственную память, как это было бы с этой строкой.

Другие вопросы по тегам