2011-02-06 9 views
2

이 코드의 오류는 무엇입니까? 왜 내가 그것을 시도하는 방식으로 요소를 역 참조 할 수 없습니다.C의 구조에 대한 포인터

#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

구조체를 형식 정의를하지 마십시오 오류 –

+2

을 적어주세요. 이미 구조체로 형식이 있습니다. 코드를 복잡하게 만드는 것뿐입니다. –

+0

@Felice Pollano 경고의 바다와 별개로 : 오류 : 불완전한 타입에 대한 포인터를 역 참조 – phihag

답변

11

구조 정의에 사용자가 더 많이 재사용하는 typename이 누락됩니다. 왼쪽 및 오른쪽 필드를 선언하면 컴파일러는 struct 노드가 무엇인지 알 수 없습니다. 구조가 노드라고 선언해야합니다. 이것은 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; 
} 
+0

도 작동하지 않습니다 – user420878

+0

여전히 불완전한 유형에 대한 역 참조 포인터 – user420878

+2

@ user420878이 코드를 정확하게 사용하고 있는지 확인하십시오. 여기 gcc 4.3.2로 잘 컴파일하십시오. jHackTheRipper가 유형 이름을 노드에서 노드로 변경했습니다. 대신 구조체 node를 구조체 node_its_a_struct로 바꿀 수도 있습니다. – phihag

3

우선 모든 경고를 설정하도록 권장합니다. 첫 번째 문제는 root->left을 할당하는 것입니다. struct 정의 내에 typedef에 의해 설정된 이름을 참조 할 수 없습니다. 대신,이 같은 Use the struct name는 :

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

감사합니다. 지금 문제가 있습니다 ... 작동 중입니다. :) – user420878

관련 문제