2016-10-13 2 views
-1

내가 노력하고 가능한 한 다음 코드를 증류 한이 잘 컴파일C 구조체의 형식 정의와 선언의 원인이 포인터 오류

#include <stdlib.h> 

typedef struct item{ 
    struct item *next; 
}item; 

void addItem(item *list) 
{ 
    item *newItem = list; 
    while(newItem->next != NULL){ 
     newItem = newItem->next; 
    } 

    newItem->next = malloc(sizeof(item)); 
    newItem->next->next = NULL; 
} 

int main() 
{ 
    item *groceryList = NULL; 
    groceryList = malloc(sizeof(item)); 
    if(groceryList == NULL) 
     return 1; 
    groceryList->next = NULL; 

    addItem(groceryList); 

    return 0; 
} 

.

structpointertest.c:11:11: warning: assignment from incompatible pointer type structpointertest.c:15:15: error: request for member 'next' in something not a structure or union

나는이 문제를 일으키는 구조체 선언을 이해하지 않습니다하지만에 구조체 선언 (또는 변경의 조합) 변경 : 컴파일 할 때

typedef struct{ /*Removed "item"*/ 
    item *next; /*Removed "struct"*/ 
}item; 

하면 다음과 같은 오류가 발생합니다 ? 중첩 된 구조체를 사용하고 있다는 사실과 관련이 있습니까?

감사합니다.

+1

컴파일러는'item'이 선언 행'item * next'에 있는지 알지 못합니다. –

+0

"중첩 구조"가 없습니다. 그리고 끝없는 재귀가있을 수 없습니다. – Olaf

+0

죄송합니다. 나는 그것을 심각하게 말했습니다. 나는 구조의 중첩을 의미하는 것이 아니라 별칭의 중첩을 의미했습니다. –

답변

3

C에서 사용하려면 먼저 선언해야합니다. 당신이

typedef struct item { ... } 

을 할 때 struct item 부분은 구조 이름 item이 존재 함을 컴파일러를 알려주는 선언입니다. 즉 나중에 구조체 내부에서 포인터를 정의 할 수 있습니다.

당신이 구조에 이름을 부여되지 않으며,이 구조 내에서 사용 할 수 없도록 타입 별칭 item이 구조 후 를 선언

typedef struct { ... } item; 

을 수행 할 때.

간단한 해결책은 첫 번째 방법을 사용하는 것입니다. 또 다른 솔루션은 구조 앞에 형식 별칭을 선언하는 것입니다.

typedef struct item item; 
struct item 
{ 
    item *next; // Can use type-alias, as it has been declared up above 
}; 

어느 경우 든 구조 자체에 이름을 지정해야합니다.

또한 struct item *next; (또는 item *next;)의 구조에 대한 포인터 인 멤버 변수를 선언하고, 그 자체가 반복적 중첩 실제 구조 아니다 참고. 아직 완전히 정의되지 않은 포인터를 만드는 것은 괜찮습니다.

+0

마지막 단락은 나에게 나쁜 표현이었습니다. –

+0

가 사이트에 새로운, 의견을 입력 나쁜입니다! 아무튼 감사 해요. 이제 typedef가 정의 된 순서를 봅니다. –

+0

+1 아직 완전히 정의되지 않은 포인터를 만들려고했기 때문에 ... 그리고 놀라 울 정도로 작동합니다! 나는 그것을 모른다. – JoulinRouge