Array [n] vs Array [10]-변수 대 실수로 배열 초기화


91

내 코드에 다음과 같은 문제가 있습니다.

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

다음 오류를 반환합니다.

error: variable-sized object 'tenorData' may not be initialized

double tenorData[10]작품을 사용하는 반면 .

왜 그럴까요?


4
언어를 제공하면 도움이 될 것입니다. C ++에서 해당 형식의 배열은 컴파일 시간 상수 크기를 가져야합니다.
OrangeAlmondSoap

C ++, mingw32-g ++ 컴파일러와 함께 Codeblocks 사용!
msmf14 2013

감사합니다. Justin과 @AndrewVarnerin이 해결했습니다! int 앞에 const 추가 : const int n = 10; 해결되었습니다!
msmf14

답변:


189

C ++에서 가변 길이 배열은 유효하지 않습니다. G ++에서는 이것을 "확장자"로 허용하므로 (C에서 허용하기 때문에) G ++에서는 ( -pedanticC ++ 표준을 따르지 않고) 다음과 같이 할 수 있습니다.

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

"가변 길이 배열"(적절한 가변 길이 배열이 허용되지 않기 때문에 C ++에서 "동적 크기 배열"이라고 더 잘 함)을 원하면 메모리를 직접 동적으로 할당해야합니다.

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

또는 더 나은 방법은 표준 컨테이너를 사용하는 것입니다.

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

그래도 적절한 배열이 필요 하면 만들 때 변수가 아닌 상수를 사용할 수 있습니다 .

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

마찬가지로 C ++ 11의 함수에서 크기를 얻으려면 다음을 사용할 수 있습니다 constexpr.

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
감사합니다. 이것은 또 다른 좋은 해결책입니다. 결국 내가 정말로 필요한 것은 배열이 아니라 벡터입니다!
msmf14

1
@ msmf14 : 예, 표준 컨테이너 (예 :) vector는 매우 유용합니다.
Cornstalks

벡터 솔루션은 "std :: vector <[some class]> a (n);"을 호출 할 때 각 요소를 초기화합니까?
Justin

3
많이 할당하지 않는 경우 (스택 크기에 비해 작 으면) alloca (3) 및 배치 new와 함께 스택 메모리를 사용하는 것이 좋습니다. 이렇게하면 메모리 확보에 대해 걱정할 필요가 없으며 메모리 할당이 훨씬 빠릅니다.
holgac

2
g ++에서 허용한다고 언급 한 경우 +1. 이 오류를 관찰하지 않았기 때문에 차이점을 설명합니다.
gebbissimo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.