프로그래밍언어/C언어[Error]
[C언어][Error] 041. variably modified ‘variable’ at file scope – 전역에서 가변 크기 배열 사용
about_IT
2025. 4. 27. 17:07
728x90
이 오류는 전역 변수나 파일 범위(file scope)에서 가변 크기 배열(VLA: Variable Length Array)을 선언하려 할 때 발생합니다. C언어에서는 VLA는 반드시 함수 내부에서만 사용 가능하며, 전역 또는 정적(static) 범위에서는 사용할 수 없습니다.
즉, 크기가 컴파일 시간에 결정되지 않는 배열은 함수 외부나 정적 컨텍스트에서는 정의할 수 없습니다. 컴파일러는 배열의 크기를 컴파일 타임에 알아야 하므로 오류를 발생시킵니다.
● 오류 예제
int size = 5;
int arr[size]; // 오류: 전역에서 가변 크기 배열 선언
컴파일 시 다음과 같은 오류 메시지를 출력합니다.
error: variably modified ‘arr’ at file scope
● 해결 방법
가변 크기 배열은 반드시 함수 내부에서만 선언해야 하며, 전역에서는 상수 크기를 사용하거나 동적 메모리를 사용하는 방식으로 해결할 수 있습니다.
#include <stdio.h>
int main() {
int size = 5;
int arr[size]; // 유효한 사용: 함수 내부의 VLA
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
printf("%d ", arr[i]);
}
return 0;
}
출력 결과:
1 2 3 4 5
또는 전역에서 사용하고 싶다면, 고정된 상수를 사용하거나 malloc을 통해 동적으로 할당해야 합니다.
#define SIZE 5
int arr[SIZE]; // 정적 배열 사용 가능
● 실전 팁
- VLA는 함수 내부에서만 선언 가능하며, 전역 범위에서는 사용할 수 없습니다.
- 전역 배열이 필요하다면 고정된 크기를 사용하거나 동적 할당을 고려하세요.
- 동적 할당 시에는 메모리 해제를 잊지 마세요.
C언어에서는 전역 범위에서 모든 배열의 크기를 컴파일 시간에 알아야 하므로, 변수로 크기를 지정하는 VLA는 사용할 수 없습니다. 안전하고 명확한 메모리 구성을 위해 사용 범위에 맞는 배열 선언 방식을 선택하는 것이 중요합니다.
728x90