본문 바로가기
프로그래밍언어/C언어[Error]

[C언어][Error] 018. dereferencing pointer to incomplete type – 불완전한 타입에 대해 포인터 역참조 시도

by about_IT 2025. 4. 24.

이 오류는 정의되지 않은 구조체나 불완전한 타입에 대해 포인터 역참조를 시도할 때 발생합니다. 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 선언만 노출하는 경우, 내부 멤버 접근은 원칙적으로 허용되지 않습니다.

불완전 타입은 구조만 선언된 상태로, 포인터 선언은 가능하지만 실제 멤버 접근을 위해서는 반드시 정의가 필요합니다. 따라서 구조체 사용 시 선언과 정의의 위치를 항상 주의 깊게 확인해야 합니다.