2017-12-25 21 views
2

그것은 C++에서 정적 배열이 const를 표현에서만 초기화 할 수 있다는 것을 기억 될 것 같다,하지만 당신이 쓰는 경우 :C++ 정적 배열이

#include <iostream> 

int main() { 
    int n; 
    std::cin >> n; 
    int a[n]; 
    std::cout << sizeof(a); 

    return 0; 
} 

이 프로그램이 성공적으로 컴파일 (GCC C++ 17)과 n * sizeof (int)를 인쇄하십시오. 하지만이 이유는 무엇입니까?

+1

'std :: vector'를 사용하지 않는 이유는 무엇입니까? –

+1

GCC (불행히도)는 기본적으로 VLA를 확장으로 허용합니다. '-std = C++ 17' 및/또는'-Wvla -Werror'로 컴파일하면 컴파일되지 않습니다. –

+0

그러나 VLA는 어떻게 작동합니까? 스택 예약이 있습니까? – Mano

답변

5

Variable-length arrays은 표준에 속하지 않습니다. GCC의 경우 컴파일러 확장으로 제공 될 수 있습니다. 컴파일 할 때 당신의 경고를받을 가능성이 :

경고 : ISO C++는 가변 길이 배열 '는이'[-Wvla]

배열에 적용

sizeof 연산자의 크기를 반환 금지 기본 배열의 크기 인 전체 배열은 요소의 수를 곱합니다. 기준 상태 강조 광산 :

동일한 코드 위에 다른 패스 수명 동안하지만 변경되지 않는 각 VLA 인스턴스 의 크기는, 그 다른 크기로 할당 될 수있다.

공식 GCC 문서는 6.19 Arrays of Variable Length 상태 제목 :이 배열이 다른 자동 배열처럼 선언

을하지만, 상수 표현식이 아닌 길이. 기억 영역은 선언 지점을 에 할당되고 선언을 포함하는 블록 범위 이 종료되면 할당이 해제됩니다.

raw (C 스타일) 배열에 대해 std::vector 또는 std::array을 선호한다고 말합니다.