2009-12-08 2 views
8

왜 우리는 이것을 C 언어로 할 수 있습니까?런타임 중에 [n]이 (가) c에서 허용되는 이유는 무엇입니까?

int n; 
scanf("%d",&n); 
int a[n]; 

로드 시간 동안 배열이 메모리에 있다고 생각했지만 위의 예제가 런타임 중에 작동하는 것처럼 보입니다. 나는 어떤 것을 오해하니? 너희들도 도와 줄 수 있니?

덕분에,

+0

그것은 또한 g ++에 의한 확장으로 제공됩니다 VLA는 (C++의 일부가 아니라 C의 일부가 될 것입니다 있지만 ++ 0x). –

+0

C++ 확장은 가변 길이 배열 유형에 대한 참조를 지원하지 않습니다. 함수 매개 변수는 가변 길이 배열 유형에 대한 참조가 될 수 없습니다. (IBM C++) –

+2

아니요, C++ 0x의 일부가 아닙니다. –

답변

6

I thought array is *al*located memory during load time but seems like the above example works during run-time.

예, 일반 <datatype> <Array_Name> [<size>]과 같은 배열은 C89에 있고 C99에도 존재하는로드 시간 동안 메모리에 할당됩니다.

그러나 코드 스 니펫 int a[n];은 가변 길이 배열 또는 VLA입니다. C99의 VLA는 컴파일 타임 상수 일 필요는 없다는 점을 제외하고는 다른 배열과 마찬가지로 정의됩니다.

블라스의 필요에 괜찮은 기사는 여기에서 찾을 수 있습니다 : http://www.ddj.com/cpp/184401444 :

9

나는 C에서 전문가는 생각하지 않습니다, 그러나 이것은 예를 들어 C99supported by GCC 추가로 variable-length array, 수 있습니다. GCC는 스택에 이러한 배열의 메모리를 할당하므로 함수에서 돌아 왔을 때 자동으로 해제됩니다.

+0

이것은 VLA (C99 기능)입니다. 왜 확실하지 않습니까? –

+0

나는 C에서 전문가가 아니었다. 왜냐하면 VLA와 같은 것이 있다는 것을 알았지 만 결코 사용하지 않았고 포스터가 말한 것이 100 % 확실하지 않았기 때문이다. – zoul

0

코드 작성 방법 (특히 문장이 있음)을 감안할 때, 이것은 함수 내에 있어야합니다.

사양에서 엄격하게 요구되는지 확실하지 않지만 모든 자동 (즉, 기능 수준, 정적이 아닌) 배열이 스택에 배치됩니다. 따라서 일반 또는 VL 배열의 여부에 관계없이 런타임에 메모리가 할당됩니다.

비 자동 배열 용 메모리는 런타임에 처리되지 않으므로 VLA를 지원하지 않습니다. 다음 코드를 컴파일하려고하면 : 나는 (GCC 4.2.1)에서이 테스트를 컴파일러에

extern int size; 
char buff1[size]; 

void doit(int x) 
{ 
    static int buff2[x]; 
    int buff3[x]; 
} 

을, 나는 다음있어 오류 :

moo.c:2: error: variably modified ‘buff1’ at file scope 
moo.c: In function ‘doit’: 
moo.c:6: error: storage size of ‘buff2’ isn’t constant 
관련 문제