> 백엔드 개발 > C++ > 상수가 아닌 배열 바운드에도 불구하고 이 C 코드가 컴파일되는 이유는 무엇입니까?

상수가 아닌 배열 바운드에도 불구하고 이 C 코드가 컴파일되는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-05 10:29:40
원래의
348명이 탐색했습니다.

Why Does This C   Code Compile Despite a Non-Constant Array Bound?

상수 표현식으로 바인딩된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿