이 오류는 정의되지 않은 구조체나 불완전한 타입에 대해 포인터 역참조를 시도할 때 발생합니다. C언어에서 포인터를 역참조하려면 해당 타입의 전체 정의가 필요하지만, 선언만 존재하고 정의가 없는 경우에는 메모리 크기나 멤버 구성을 알 수 없기 때문에 역참조가 불가능합니다.
주로 구조체의 정의를 include하지 않았거나, typedef struct만 선언하고 실제 내용을 작성하지 않은 경우에 자주 발생합니다.
● 오류 예제
// file1.h
struct Person;
// file2.c
#include "file1.h"
#include <stdio.h>
int main() {
struct Person *p;
p->age = 30; // 오류: 구조체 정의가 없음
return 0;
}
위 코드에서 struct Person은 선언만 되어 있고 실제 정의가 없기 때문에, 컴파일러는 포인터를 역참조하여 멤버에 접근할 수 없습니다.
error: dereferencing pointer to incomplete type ‘struct Person’
● 해결 방법
해당 구조체의 전체 정의를 반드시 포함해야 포인터를 역참조할 수 있습니다.
// file1.h
struct Person {
int age;
};
// file2.c
#include "file1.h"
#include <stdio.h>
int main() {
struct Person p;
p.age = 30;
printf("%d\n", p.age);
return 0;
}
출력 결과:
30
● 실전 팁
- 구조체를 포인터로 사용할 경우, 해당 구조체의 전체 정의가 반드시 필요합니다.
- 헤더 파일에 구조체를 선언만 했다면, 정의는 다른 파일이 아니라 동일한 번역 단위에서 포함되도록 관리하세요.
- 라이브러리에서 typedef struct 선언만 노출하는 경우, 내부 멤버 접근은 원칙적으로 허용되지 않습니다.
불완전 타입은 구조만 선언된 상태로, 포인터 선언은 가능하지만 실제 멤버 접근을 위해서는 반드시 정의가 필요합니다. 따라서 구조체 사용 시 선언과 정의의 위치를 항상 주의 깊게 확인해야 합니다.