상수 표현식으로 바인딩된 C 배열: 코드의 예외
C에서 배열 바인딩은 일반적으로 상수 표현식이어야 합니다. 배열의 크기는 컴파일 중에 알려집니다. 그러나 어떤 경우에는 이 규칙이 위반되는 것 같습니다. 구체적인 예를 살펴보겠습니다.
#include <iostream> using namespace std; int main() { int n = 10; int a[n]; // Array a with size n for (int i = 0; i < n; i++) { a[i] = i + 1; cout << a[i] << endl; } return 0; }
이 코드는 Mac에서 Xcode4를 사용하여 컴파일할 때 오류 없이 실행됩니다. 배열 a의 크기가 상수 표현식이 아님에도 불구하고 코드는 작동합니다.
설명: 가변 길이 배열(VLA)
이 이유는 다음과 같습니다. 코드 작업은 C99에 도입된 VLA(가변 길이 배열)라는 기능으로 인해 발생합니다. VLA를 사용하면 컴파일 타임에 크기를 알아야 하는 일반 배열과 달리 런타임에 배열의 크기를 결정할 수 있습니다.
제공된 코드에서 n은 상수 표현식이 아니라 변수입니다. 그러나 Xcode4의 컴파일러는 VLA를 지원하므로 n 값을 기준으로 런타임 중에 배열 a에 메모리를 할당할 수 있습니다.
스택 할당과 힙 할당 비교
VLA는 정적 배열과 유사하게 스택에 할당된다는 점에 유의하는 것이 중요합니다. 이는 프로그램이 VLA가 선언된 함수에 들어가고 나올 때 배열의 메모리가 자동으로 할당되고 해제된다는 것을 의미합니다. 이 동작은 힙에 할당되고 포인터를 사용하여 수동으로 관리해야 하는 일반 배열과 다릅니다.
위 내용은 상수가 아닌 배열 바운드에도 불구하고 이 C 코드가 컴파일되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!