가변 길이 배열(VLA, Variable Length Arrays)은 C99 표준에서 도입되었으며, 그 이전에는 모든 배열의 크기가 컴파일 단계에서 알려져야 했습니다. VLA는 런타임에만 알려지는 변수에 의해 크기가 결정되는 배열을 선언할 수 있게 해줍니다.
VLA의 잘못된 사용은 메모리 할당 오류(예: 배열 크기가 너무 커서 스택 오버플로우가 발생)와 서로 다른 컴파일러 간에 VLA를 전달할 수 없는 문제(모든 컴파일러가 지원하지 않음), C 및 C++의 이전 표준과의 제한된 호환성으로 이어질 수 있습니다. 또한, 스택에 메모리가 할당되기 때문에 디버깅이 복잡해지며, 이는 항상 예상되는 것이 아닙니다.
VLA를 사용할 때는 스택에서만 존재하며 전역 또는 정적일 수 없다는 점을 명심해야 합니다. C++와의 상호작용을 보장하고 유연성이 필요한 경우, malloc을 통한 동적 배열을 사용하는 것이 좋습니다. VLA 지원이 보장되지 않는 경우, 정적 배열이나 C90 표준으로 제한하는 것이 호환성 측면에서 좋습니다.
코드 예제:
#include <stdio.h> void process(size_t n) { int arr[n]; // VLA for(size_t i = 0; i < n; i++) arr[i] = i; for(size_t i = 0; i < n; i++) printf("%d ", arr[i]); } int main() { process(5); return 0; }
주요 특징:
함수 내에서 static int arr[n];와 같이 가변 길이 정적 배열을 선언할 수 있나요?
아니요, 정적 변수는 컴파일 단계에서 특정 크기를 가져야 합니다. 따라서 static int arr[n];는 변수 크기로 인해 컴파일 오류를 발생시킵니다.
함수에서 나올 때 VLA는 자동으로 해제되나요?
네, VLA는 스택에 배치되며 블록/함수를 종료할 때 자동으로 메모리가 해제됩니다. 일반적인 로컬 변수와 같습니다.
매우 큰 VLA를 할당하는 것은 안전한가요?
아니요, 스택의 크기는 제한되어 있습니다(예: 1MB 또는 8MB). 큰 VLA 할당 시 실행 오류(스택 오버플로우)를 일으킵니다.
VLA를 사용하여 크로스 플랫폼 코드를 작성했으나 오래된 또는 엄격한 설정의 컴파일러에서 코드가 컴파일되지 않았습니다.
장점:
단점:
VLA를 지역 작업과 보장된 작은 크기에서만 사용하고, 큰 배열은 malloc/free를 사용했습니다.
장점:
단점: