2017-11-21 3 views
-1

나는 C99에서이 같은 크기가 매개 변수의 값 인 배열을 선언 할 수 있다는 사실을 알고 : 함수가 호출 될 때숨겨진 메모리 할당?

void foo(int size) { 
    int array[size]; 
    // do stuff 
} 

, 내가 이해에서 그것은 스택에 할당됩니다. 분명히 이것은 C++에서 작동하지 않아야합니다.

void bar(vector<Thing> vec) { 
    for (Thing t : vec) { 
    int n = t.get_n(); 
    int array[n]; 
    // do stuff 
    } 
} 

는 놀랍게도 컴파일러 (G는 ++) 불평하지 않았다, 왜 :

는 최근에 나는 C++에서이 같은 것을 썼다? 거기에 숨겨진 메모리가 할당되어 있습니까?

+5

경고를 설정하지 않았기 때문에 gcc 확장자 –

+2

[가변 길이 배열이 C++ 표준의 일부가 아닌 이유는 무엇입니까?] (https://stackoverflow.com/questions/1887097)/왜 가변 가변 길이 배열 - C 표준의 일부) 또는 https://stackoverflow.com/questions/7812566/why-no-variable-size-array-in-stack 또는 https : //stackoverflow.com/questions/17899274/g-variable-size-array-no-warning 또는 https://stackoverflow.com/questions/43857625/variable-sized-array-on-the-stack 또는 기타 ... –

답변

4

가변 길이 배열은 C++ 표준의 일부가 아닙니다. G ++에서 제공하는 확장 기능입니다.

-pedantic 플래그로 컴파일하면 컴파일러에서 경고를 발생시킵니다.

3

GCC는 표준에 맞지 않더라도 기본적으로 C++에서 가변 길이 어레이 (일명 VLA)를 허용합니다.

예를 들어 -std=c++14 옵션을 전달하여 표준을 엄격하게 지키면 코드가 올바르게 거부됩니다.

+0

예를 들어,'set (CMAKE_CXX_STANDARD 11)'옵션을 사용하여 프로젝트를 빌드하기 위해 cmake를 사용했습니다. 이것은'-std = C++ 11'을 컴파일러에 넘겨 주겠다고 말했지만 그렇지 않다면 배열에 대해 불평 할 것입니다. – DBLouis

+3

No : https://cmake.org/cmake/help/v3.1/prop_tgt/CXX_STANDARD.html => _ "일부 컴파일러에서는'-std = gnu ++ 11'과 같은 플래그를 추가합니다. 컴파일 라인. "_ 그러므로 GNU 확장을 자동으로 허용 할 수 있습니다. 바보 예, 서류 미비 아뇨. –

+0

@DBLouis 나는 추측하고있다. (당신이 검사해야한다), GNU 확장을 가능하게하는 C++ 11이 아닌 gnu ++ 11을 아마도 넘겼을 것이다. –