2014-10-11 2 views
0

다음은 적법한가요?가변 길이의 정적 배열

const int n=10; 
static int array[n]; 

그렇다면 왜 그렇습니까?

+0

배열의 길이가 가변적 인 것은 아닙니다. 'n'은 컴파일 타임에 값이 알려진 상수 표현식입니다. –

+0

static 또는 extern 저장 클래스 지정자로 선언 된 배열 객체는 가변 길이 배열 (VLA) 유형을 가질 수 없습니다. 정적 배열의 크기를 왜 가변적으로 만들 수 없습니까? [복제] –

+0

@ R Sahu : 그건 틀렸어. C 언어에서'const' 객체는 컴파일 타임 상수로 적합하지 않습니다. 이것은 C와 C++ 언어의 중요한 차이점입니다. – AnT

답변

3

C 언어 const의 개체는 상수으로 한정되지 않습니다. 상수 표현식을 작성하는 데 사용할 수 없습니다. 코드 예제에서 n은 C 언어의 용어에서 상수가 아닙니다. 표현 n

이 즉시 array 당신의 선언은 가변 길이 배열을 선언하려는 시도는 것을 의미

C.

(자세한 내용에 대한 "static const" vs "#define" vs "enum"Why doesn't this C program compile? What is wrong with this?를 참조하십시오.)에서 중요한 상수 표현하지 않습니다. 가변 길이 배열은 자동 (로컬) 객체로만 허용됩니다. 정적 저장 기간을 사용하여 배열을 선언하면 크기는 정수 상수 표현식, 즉 컴파일 타임 상수 여야합니다. n은 그 자격이 없습니다. 선언은 합법적이지 않습니다.

이 때문에 C 언어에서 명명 된 상수를 소개하기 위해 #define 및/또는 enum을 주로 사용하지만 const 개체를 사용하지 않습니다.

0

정적 변수는 COMPILE 시간에 할당되어야하며, 따라서 컴파일 타임에 반드시 알려야하는 경우 해당 크기와 초기화 값이 할당되어야합니다. 컴파일 시간 최적화를 사용하면 n var가 상수 값 10으로 바뀔 수 있으므로 특정 경우를 성공적으로 컴파일 할 수 있다고 주장 할 수 있습니다.

 
storage size of ‘array’ isn’t constant static int array[n]; 
             ^

정적 할당은 동적 메모리 할당 또는 자동 메모리 할당과 달리, 관련 프로그램을 실행하기 전에 컴파일 시간에 메모리를 확보하는 과정을 의미 :

2
const int n=10; 
static int array[n]; 

이 코드는 오류가 발생할 것이다 여기서 메모리는 런타임에 필요에 따라 할당됩니다.

const (C 언어) 컴파일시 해당 변수를 사용할 수 없습니다.

static int array[10]; 

그래서, 당신이 쓴 문장이 불법 또는 프로그램을 컴파일하는 동안 오류 발생 :이 같은

문은 오류가 발생하지 않을 것입니다.

관련 문제