Указатели на структуру в C - PullRequest
2 голосов
/ 06 февраля 2011

В чем ошибка в этом коде?Почему я не могу разыменовать элемент так, как я его пытаюсь.

#include<stdio.h>
typedef struct
{
    int value;
    struct node * left;
    struct node * right;
} node;

int main() {
    node* root,*temp;
    root = (node*) malloc(sizeof(node));
    root->value = 10;
    (root->left)= (node*) malloc(sizeof(node));
    (root->right)=(node*) malloc(sizeof(node));
    ((root->left)->value) =20;   // WHY AN ERROR HERE???
}   

Ответы [ 2 ]

11 голосов
/ 06 февраля 2011

В определении структуры отсутствует имя типа, которое вы будете использовать дальше.Когда вы объявляете левое и правое поле, компилятор не знает, что такое узел структуры.Вы должны объявить, что ваша структура является узлом.Это подразумевает изменение псевдонима typedef.См. Исправление здесь и далее, это прекрасно компилируется:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
        int value;
        struct node * left;
        struct node * right;
} Node;

int main() {
        Node* root,*temp;
        root = (Node*) malloc(sizeof(Node));
        root->value = 10;
        (root->left)= (Node*) malloc(sizeof(Node));
        (root->right)=(Node*) malloc(sizeof(Node));
        ((root->left)->value) =20;   /* no more errors */

        return 0;
}
3 голосов
/ 06 февраля 2011

Прежде всего, позвольте мне порекомендовать включить все предупреждения.Вы увидите первую проблему с назначением root->left вообще.Вы не можете ссылаться на имя, установленное typedef внутри определения структуры.Вместо этого Используйте имя структуры , например:

typedef struct node_t {
    int value;
    struct node_t * left;
    struct node_t * right;
} node;
...