Development Tip

동적 할당없이 런타임에 배열 크기가 허용됩니까?

yourdevel 2020. 12. 12. 12:31
반응형

동적 할당없이 런타임에 배열 크기가 허용됩니까?


나는 몇 년 동안 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 표준에서 지원됩니다.

참고 URL : https://stackoverflow.com/questions/737240/array-size-at-run-time-without-dynamic-allocation-is-allowed

반응형