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

[C언어][Error] 026. storage size of ‘variable’ isn’t known – 변수의 크기를 알 수 없음

by about_IT 2025. 4. 24.

이 오류는 변수 선언 시 컴파일러가 해당 타입의 메모리 크기를 결정할 수 없을 때 발생합니다. 특히 구조체나 typedef로 선언만 해놓고 정의하지 않은 타입을 변수로 선언하면, 컴파일러는 메모리 크기를 계산할 수 없어 오류를 발생시킵니다.

 

이는 선언만 있는 불완전한 타입(incomplete type)에 변수를 선언하려고 할 때 자주 발생하는 오류입니다.

 


● 오류 예제

// file1.h
typedef struct Node Node;

// file2.c
#include "file1.h"

int main() {
    Node n;  // 오류: Node는 정의되지 않음
    return 0;
}

위 코드에서 Node는 typedef로 선언만 되어 있고, 구조체의 실제 정의가 없기 때문에 크기를 계산할 수 없습니다. 컴파일러는 다음과 같은 오류를 출력합니다.

error: storage size of ‘n’ isn’t known

 


● 해결 방법

변수를 선언하기 전에 해당 타입이 반드시 정의되어 있어야 합니다. 정의 없이 선언만 한 경우, 컴파일러는 메모리 크기를 결정할 수 없습니다.

// 수정된 예시
typedef struct Node {
    int data;
} Node;

int main() {
    Node n;  // 정의가 있으므로 선언 가능
    n.data = 100;
    return 0;
}

 

또는 포인터를 사용하는 경우, 구조체의 크기를 몰라도 선언이 가능하므로 다음과 같이 사용할 수 있습니다.

typedef struct Node Node;

int main() {
    Node *p;  // 포인터는 선언만으로도 사용 가능
    return 0;
}

 


● 실전 팁

  • 불완전 타입에는 포인터만 선언 가능하며, 변수를 직접 선언하려면 정의가 필요합니다.
  • 헤더 파일에서 typedef 선언만 하고 정의를 다른 파일에 둘 경우, 해당 파일에서도 정의를 포함하도록 주의하세요.
  • 구조체 포인터를 활용하면 전방 선언만으로도 다양한 설계를 유연하게 할 수 있습니다.

 

C언어는 메모리 크기를 알 수 없는 타입에 대해 변수를 선언하는 것을 허용하지 않기 때문에, 선언과 정의의 차이를 명확히 이해하고 변수 선언 전에 구조체 정의가 포함되어 있는지 반드시 확인해야 합니다.