2012-07-17 65 views
1

請告訴我爲什麼下面的代碼甚至可以運行在一個strict C-99 compilerC從何時開始使用可變長度數組?

#include <stdio.h> 
int main() 
{ 
    int n; 
    scanf("%d",&n); 
    int a[n]; 
    a[1]=10; 
    a[2]=5; 
    printf("%d %d",a[1],a[2]); 
} 

變量聲明用C任何其他陳述權之前,必須進行?如果我們需要一個動態分配的數組,我們必須使用像malloc()這樣的內存分配函數,但它是如何獲取並輸入整數並分配這個大小的數組?

+0

兩者[可變長度數組(http://en.wikipedia.org/wiki/Variable-length_array)和混聲明/ C99中加入代碼。 – Mysticial 2012-07-17 05:15:21

回答

5

這被稱爲variable-length array,並由C99標準支持。
這不適用於C89或任何版本的C++。

+0

這也適用於普通的C編譯器,但我認爲最初的C標準不允許它 – sasidhar 2012-07-17 05:15:09

+0

C99還增加了在塊內混合聲明和語句的功能。 C++一直都有這個; C90沒有。 – 2012-07-17 05:15:16

+1

@sasidhar:請定義「正常的C編譯器」。大多數C編譯器默認不完全支持*任何*語言標準;你通常必須添加額外的命令行參數。對於gcc,'-ansi -pedantic'使它與C89/C90非常接近;對於(幾乎)C99一致性,請使用'-std = c99 -pedantic'。 – 2012-07-17 05:16:37

2

該功能被稱爲variable length arrays,並具體回答你的問題,他們在C99標準引入(可能是一些C編譯器有過他們,但任何C99兼容的編譯器必須有他們)。

你會發現很多SO答案,建議你不要使用它們。使用malloc()時,會出現一個用於內存分配失敗的已定義接口:調用返回NULL。有了VLA,就沒有這樣的接口:它是未定義的行爲,當分配失敗時會發生什麼。

3

事實上,在這個代碼片段中有兩種機制在C90中是不允許的,但是在C99中。第一個是可變大小的數組聲明,使用a[n]。第二個是聲明和代碼的混合,a在一行代碼之後聲明。

我覺得this list by David Tribble得心應手。它專注於C++,但也讓您對C90和C99之間的差異有了很好的概述。

如果我們這樣想一個動態分配的數組中,我們使用的內存malloc之類) 分配功能(

顯然,你已經知道了,但值得一提的反正:malloc()被用於在分配內存堆。你的例子中的數組被分配在堆棧上,這是一種不同的機制。請參閱this answer以獲得有關差異的極佳解釋。

+0

表示同意,我不會更關心分配的位置。我的問題是C標準允許的天氣嗎? – sasidhar 2012-07-17 05:17:39

+0

C99確實如此。有關C99和C90的更多信息,請參閱[這裏](http://david.tribble.com/text/cdiffs.htm#C90-mixed-decl-stmt) - 我知道該頁面主要是關於C++,但具有良好的信息關於C,以及確切的參考在哪裏看語言規範。 – 2012-07-17 05:22:47

1

C99允許在您的示例中使用可變長度數組。

here是關於它的說明artcile更