프로그래밍언어/C언어[Error]
[C언어][Error] 044. initializer for aggregate is not constant – 구조체나 배열 초기화 값이 상수가 아님
about_IT
2025. 4. 28. 00:05
이 오류는 전역 변수나 정적(static) 변수의 초기화에서 상수가 아닌 값을 사용했을 때 발생합니다.
C언어에서는 전역/정적 변수의 초기화 값은 반드시 컴파일 타임에 결정 가능한 상수 표현식이어야 하며, 런타임에 결정되는 변수나 계산식을 사용할 수 없습니다.
특히 전역 범위나 static으로 선언된 배열, 구조체 등을 초기화할 때 변수 값을 사용하면 컴파일러는 오류를 발생시킵니다.
● 오류 예제
int x = 10;
int arr[3] = {1, x, 3}; // 오류: x는 상수가 아님 (전역 초기화 불가)
컴파일러는 다음과 같은 오류 메시지를 출력합니다.
error: initializer element is not constant
※ 참고: 함수 내부(local scope)에서는 변수로 배열을 초기화해도 오류가 발생하지 않습니다.
#include <stdio.h>
int main() {
int x = 10;
int arr[3] = {1, x, 3}; // 정상: 지역 변수는 런타임 값으로 초기화 가능
return 0;
}
이 코드는 오류 없이 정상 컴파일됩니다.
● 해결 방법
전역 변수나 static 변수 초기화 시에는 반드시 리터럴 상수나 매크로 상수(#define, enum 등)를 사용해야 합니다.
#define VALUE 10
int arr[3] = {1, VALUE, 3}; // 정상: 컴파일 타임 상수 사용
● 실전 팁
- 전역/정적 변수의 초기화는 반드시 상수식이어야 합니다.
- 지역 변수는 런타임 값으로 초기화할 수 있지만, 전역/정적 변수는 안 됩니다.
- 필요한 경우 매크로 상수나 enum을 활용하여 상수 표현식을 사용하세요.
C언어에서 초기화의 시점과 범위를 정확히 구분하는 것은 매우 중요합니다.
특히 전역/정적 변수는 컴파일 타임에 메모리 레이아웃이 확정되어야 하므로, 반드시 상수로 초기화해야 컴파일 오류를 방지할 수 있습니다.