동적 할당없이 런타임에 배열 크기가 허용됩니까?
나는 몇 년 동안 C ++를 사용해 왔고 오늘은 코드를 보았는데 이것이 어떻게 완벽하게 합법적 일 수 있습니까?
int main(int argc, char **argv)
{
size_t size;
cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
cout << i << endl;
}
return 0;
}
GCC에 따라 컴파일되었습니다.
new
또는 없이 런타임에 크기를 어떻게 결정할 수 malloc
있습니까?
다시 한 번 확인하기 위해 일부 유사한 코드가 저장 용량 오류를 제공한다고 주장했습니다.
Deitel의 C ++ How To Program p. Common Programming Error 4.5의 261 상태 :
자동 및 정적 배열의 크기를 선언하는 데 상수 만 사용할 수 있습니다.
나를 계몽하십시오.
이것은 C99에서 유효합니다.
C99 표준은 스택에서 가변 크기 배열을 지원합니다. 아마도 당신의 컴파일러는이 구조를 지원하도록 선택했을 것입니다.
이것은 malloc
및 와는 다릅니다 new
. 스택 포인터를 조정하는 gcc
것과 마찬가지로 스택에 배열을 할당합니다 int array[100]
. 힙 할당이 수행되지 않습니다. 그것은 _alloca
.
이를 VLA (가변 길이 배열)라고합니다. c99에서는 표준이지만 gcc는 C ++ 코드에서 확장으로 허용합니다. 코드를 거부하려면 -std=standard
, -ansi
및 -pedantic
옵션을 사용해보십시오 .
그것은이다 유효한 에만 C99에. 다음 번에는 신뢰할 수있는 컴파일러 에서 코드를 확인해보십시오 .
유효한 C99이며 유효한 C ++가 아닙니다. 이것은 두 언어 간의 몇 가지 차이점 중 하나가 아닙니다.
Dev-Cpp 컴파일러를 사용하는 경우 배열에 동적으로 크기를 줄 수 있습니다. 시도했지만 오류가 없지만 Visual C ++ 및 Visual Studio 컴파일러에서는 불가능합니다. 그 이유는 dev-c ++가 초기화되지 않은 int에 양수를 할당하고 숫자를 주면 주어진 숫자로 대체되기 때문이라고 생각합니다. 그러나 아마도 다른 컴파일러는 초기화되지 않은 변수에 null을 제공합니다.
이 코드는 GNU GCC 컴파일러에서 실행됩니다.
#include<bits/stdc++.h>
int main(int argc, char **argv)
{
size_t size;
std:: cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
std:: cout << i;
}
return 0;
}
VLA (가변 길이 배열)는 최근에 승인되어 출판을 기다리고있는 C ++ 14 표준에서 지원됩니다.
'Development Tip' 카테고리의 다른 글
Java 컴파일러가 연결할 수없는 then 문에 대해 연결할 수없는 문 오류를 생성하지 않는 이유는 무엇입니까? (0) | 2020.12.12 |
---|---|
undefined 값을 설정하면 어떻게됩니까? (0) | 2020.12.12 |
WPF 컨트롤에 대한 Binding.Mode = Default의 기본값은 무엇입니까? (0) | 2020.12.12 |
sh의 소스 대체 (0) | 2020.12.12 |
C # 6 보간 된 문자열을 사용하여 double 형식을 지정하는 방법은 무엇입니까? (0) | 2020.12.11 |