2014-11-16 2 views
-2

나는 C 프로그래밍을 처음 사용합니다.불완전 유형에 대한 derefencing 포인터

는 그래서이 내 C 파일

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

typedef struct Rec *List; 
typedef struct Listing{ 

    node *items; 
    int numelems; 
    struct List *next; 

}Listing; 

int sum(List L) 
{ 
    if(L->items == NULL) 
    { 
     return NULL; 
    } 
    return (L->head + sum(L->tail)); 
} 

int main(void) 
{ 
    return 1; 
} 

이 가 if(L->items == NULL)에서 불완전 형에 대한 포인터를 역 참조라고 어디이 오류를 얻고있는 내 헤더 파일

typedef struct Rec *node; 

입니다. 그것이 구조체에 있다는 것을 알고 있지만 그것을 고치는 방법을 모른다. 나는 시행 착오를 시도했지만, 나의 오류가 무엇이고 어디서 일어 났는지 이해하고 싶다.

추신 :이 프로그램은 나 자신을위한 것입니다.

+3

'header.h'에서 무엇을보고? 'struct Rec' 또는'struct List'를 정의합니까? 그렇지 않다면, 그게 문제입니다.'List' 매개 변수는'struct Rec *'이고,'struct Rec'을 정의하지 않았다면 문제가 생깁니다. 'struct listing'은 다른 타입에 대한 포인터 인'struct List * '를 포함합니다. 코드에서'List' 타입은'struct List' 타입과 관련이 없습니다. –

+1

'typedef struct Rec * node;'- ** 아니, 아니, 안돼, 안돼! ** 뒤에 포인터를 숨기지 마라. (오해의 소지가 다르게 명명 된)'typedef'! –

답변

0

헤더의 유일한 항목이 typedef struct Rec *node; 인 경우 그게 문제입니다. struct Rec 또는 struct List을 정의하지 않았습니다. 당신은 그들이 존재한다고 말했지만 그게 전부입니다. 이렇게하면 불완전한 유형이 만들어지며 컴파일러가 불완전한 구조 유형의 멤버를 알지 못하기 때문에 불완전한 구조 유형을 역 참조 할 수 없습니다.

List 매개 변수는 struct Rec *이며 변함이 없으므로 struct Rec을 정의하지 않은 경우 문제가 발생합니다. struct Listing에는 다른 유형의 포인터 인 struct List *이 포함되어 있습니다. 코드에서 List 유형은 struct List 유형과 관련이 없습니다. nodeList은 모두 struct Rec *의 별칭입니다.

sum()의 코드는 그래서 당신의 struct Rec 그 이름을 포함 할 필요는 List 구조 포인터의 headtail 멤버를 참조합니다.

일반적으로 구조 태그와 typedef 이름을 긴밀하게 연결하는 것이 가장 좋습니다. 즉 :

typedef struct Node Node; 

아니라 :

typedef struct Angel Elephant; 

은 또한, 일반적인 합의가 typedef에서 포인터를 포함하지 않는 것이 좋습니다 것입니다. 즉, 위의 typedef의 작성 OK입니다,하지만 확인되지는 사용 : 예를 들어

typedef struct Fish *Fish; 

, Is it a good idea to typedef pointers?

관련 문제