2015-05-17 4 views
4

У меня есть следующие:Как каскад -> оператор?

typedef struct Node_struct 
{ 
    int number; 
    Node *nextNode; 
    Node *prevNode; 
} Node; 

и позже

Node *nodeInSet = lookup(set, number); 
nodeInSet->nextNode = (Node *) malloc(sizeof(Node)); 
nodeInSet->nextNode->prevNode 

последняя строка говорит: «Выражение должно иметь указатель на класс типа». Я не вижу, как мой код ошибочен. Поскольку nodeInSet->nextNode является Node *, я думаю, мне должно быть позволено написать nodeInSet->nextNode->prevNode. Что здесь не работает?

+0

Я также подозреваю, что вы используете неправильный компилятор в противном случае [Не отвергни возвращаемое значение из 'таНос()'] (http://stackoverflow.com/a/605858/1983495). Вы можете написать это, но вы действительно не должны. Из примера кода невозможно сказать, почему происходит ошибка, можете ли вы опубликовать воспроизводимый образец? Кроме того, не будет 'nodeInSet-> nextNode-> prevNode' быть' nodeInSet'? если список правильно заполнен. –

+1

внутри 'Node_struct'' typedef Node' еще не определен, поэтому вы должны объявить 'struct Node_struct * nextNode' – bolov

+0

, определение структуры не должно быть typedef'd. typedef'ing загромождает код, приводит к неправильному пониманию, не добавляет значения и загромождает пространство имен компилятора. Скорее всего, используйте: «struct Node_struct» – user3629249

ответ

6

prevNode и nextNode члены имеют неполный тип, вы должны написать это

typedef struct Node_struct 
{ 
    int number; 
    struct Node_struct *nextNode; 
    struct Node_struct *prevNode; 
} Node; 

или

typedef struct Node_struct Node; 
struct Node_struct 
{ 
    int number; 
    Node *nextNode; 
    Node *prevNode; 
}; 

Причина в том, что вы можете объявить poniter к неполному типу, но если вы попытаетесь разыменовать указатель, например, когда вы используете оператор ->, тогда тип должен быть известен, так как требуется размер этого типа.

3

Вы можете изменить свой код на это.

typedef struct Node_struct 
{ 
    int number; 
    struct Node_struct *nextNode; 
    struct Node_struct *prevNode; 
} Node; 
+0

Это не факультативно, вы можете изменить ... звуки, как будто это так. –

+0

Благодарим вас за советы. –

Смежные вопросы