Ошибка: запрос члена «****» в чем-то, что не является структурой или объединением

У меня есть 2 структуры, использующие указатели для формирования связанного списка.

typedef struct { 
    char *text;
    int count;
} *Item;

typedef struct node {
    Item item;
    struct node *next;
} *link;

Я пытаюсь создать кучу операций над этим типом, но у меня много проблем с этой конкретной функцией.

ошибка: запрос элемента «текст» в чем-то, что не является структурой или объединением strcpy(new->item->text, buffer->text);

ошибка: запрос элемента «текст» в чем-то, что не является структурой или объединением new->item->text = (char*) malloc(sizeof(char)*(strlen(buffer->text)+1));

По сути, ошибка связана с проходом buffer->text, но я возился с ним в течение последнего часа и, похоже, не могу найти, что с ним не так. Я, вероятно, упускаю что-то очевидное, но я больше не могу об этом слышать.

link new_item(Item* buffer) {
   link new = (link) malloc(sizeof(struct node));
   new->item->text = (char*) malloc(sizeof(char)*(strlen(buffer->text)+1));
   strcpy(new->item->text, buffer->text);
   new->item->count = 1;
   new->next = NULL;
   return new;
}

person spacing    schedule 14.05.2016    source источник
comment
Сообщение иногда означает, что вы используете . вместо -> или наоборот. В качестве альтернативы это означает, что LHS ссылки не является ни указателем на структуру, ни структурой; и это ваша проблема здесь. См. Хорошая ли идея указывать указатели typedef - ответ Нет, потому что это приводит к таким проблемам. Переменная buffer является указателем на указатель на структуру; вам нужно использовать (*buffer)->text и т. д. Или вам нужно изменить функцию на link new_item(Item buffer).   -  person Jonathan Leffler    schedule 14.05.2016


Ответы (1)


Проблема в том, что у вас два уровня косвенности вместо одного. В частности, buffer имеет тип Item *, а Item — это struct {...} *. Возможно, вы захотите изменить Item *buffer только на Item buffer. Если вам действительно нужны два уровня косвенности, вам нужно будет сделать (*buffer)->text для доступа к полю text, но это, вероятно, не то, что вам нужно.

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

person Tom Karzes    schedule 14.05.2016