2016-08-10 4 views
1

다음은 포인터를 포인터로 사용하여 링크 된 목록에 노드를 추가하려고하는 간단한 코드입니다.포인터에 대한 포인터 : 참조 멤버 오류

#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
     int data; 
     struct node *next; 
}; 

void insert(struct node **root) 
{ 
    struct node * temp = (struct node *)malloc(sizeof(struct node)); 
    if(*root == NULL) 
    { 
     *(root) = (struct node *) malloc (sizeof(struct node)); 
     *(root)->data = 5; 
     *(root)->next = temp; 
    } 
    else 
     printf("here"); 
} 

int main() 
{ 
    struct node *root = NULL; 
    insert(&root); 
    return 0; 
} 

제 생각에 main()에서 블록은 root에 할당됩니다. insert에서 해당 메모리 블록의 주소가 인수로 전달됩니다. 그런 다음 해당 주소의 구조체에 할당 된 메모리 블록이 있는지 확인하고 NULL 인 경우 구조 블록에 메모리를 할당합니다. 나는 다음과 같은 오류가 위의 코드를 실행할 때이 *root 나누었다에 의해 참조해야합니다 내가 잘못 정확히 하겠어 어디

error: request for member 'data' in something not a structure or union 

를 이해 할 수 없습니다입니다.

+3

'* (루트) -> 데이터 = 5;'- >>'(* 루트) -> 데이터 = 5; 'BTW : 코드 일부 코드 경로에서'* temp' 메모리를 누설합니다. 그리고 : 캐스트를 제거, 그들은 단지 해를 할 수 있습니다. – wildplasser

+0

그게 효과가 있었어! 고마워. 두 가지 경우에서 우선 순위가 어떻게 다른지에 대해 간략하게 설명해 주시겠습니까? –

+0

다른 사람들은 이미 그렇게했습니다. '->와'.'는 우선 순위가 가장 높습니다 ("더 엄격하게 묶습니다"). '*'는 * 약한 *. '#include 'malloc.h는 비표준 헤더입니다. 당신은'stdlib.h'를 원한다. – wildplasser

답변

3

->은 역 참조 연산자 (*)보다 더 엄격하게 바인딩됩니다. operator precedence을 참조하십시오. 해야하는 다음 줄에 대한

(*root)->data = 5; 

같은 : 당신이해야 할 의도

*(root->data) = 5; 

되었다 : 그래서,

*(root)->data = 5; 

은 동일합니다

(*root)->next = temp; 

또한, malloc.h은 (는) 표. malloc()의 원형을 얻으려면 C 표준 헤더 stdlib.h>을 포함해야합니다.

1

-> 연산자는 역 참조 연산자 *보다 우선합니다. 전체 목록은 here을 참조하십시오.

*(root)->data = 5; 

같은 그래서 선은 그것뿐만 아니라 포인터 유형으로는, 그것을 발견하지 않습니다 분명히 root 가리키는 뭔가 필드 data을 찾기 위해 노력하고있다 첫번째으로, 불법 될 것입니다 .

대신 당신이 명시 적으로 우선 사용해야합니다

(*root)->data = 5; 
관련 문제