2013-10-02 56 views
7

這是否適用於C語言?使用變量定義數組的大小

#include <stdio.h> 
int main() 
{ 
    int i = 5; 
    int a[i];  // Compiler doesn't give error here. Why? 
    printf("%d",sizeof(a)); //prints 5 * 4 =20. 4 is the size of integer datatype. 
    return 0; 
} 

編譯器在語句int a[i];處沒有給出錯誤。我不是一個常量,那麼它如何成功編譯?是因爲我使用gcc編譯器嗎?它允許用C++嗎?

+0

關於什麼是關於變長數組的常量表達式的討論,在[我的答案在這裏](http://stackoverflow.com/a/21273849/1708801)中的討論是相關的。 –

回答

17

是的,這是有效的C99,並被稱爲variable-length array(VLA)。換句話說,它已經有14年的官方語言標準。

不,它在C++中是無效的,see this question的細節。

另請注意,sizeof不是函數,因此可以編寫爲printf("%zu\n", sizeof a);,它也使用size_t值的適當格式說明符。

+0

好的謝謝。 gcc還使用C++規則編譯c程序?我可以在使用printf函數後聲明變量,並且不會給出錯誤。 – user221458

+3

@ user221458請*閱讀*關於C99的文本,因爲您似乎對您嘗試使用的語言非常不瞭解。您可以在C99中更自由地聲明變量。 – unwind

+0

VLA也支持C++。我剛剛檢查過它。 – user221458

0

我剛剛加入到放鬆的回答是,在C++ 14閱讀更多關於這一點,就會出現運行時大小的數組,其工作幾乎與VLA相同。

看到N3690array of runtime bound of T

他們似乎章8.3.4在支持鐺-3.3(在C++ 1Y模式),而不是在GCC 4.8(支持應該進來GCC 4.9) 。 當您以pre-C++ 14模式(C++ 03,C++ 11)編寫代碼時,您的代碼可能會編譯,但它應該發出關於使用C++中不支持的C99功能的警告。

而你總是應該用最迂腐的警告編譯啓用:)

2

這是有效C99它被稱爲Variable Length ArrayVLAgcc支持VLA as an extensionC99模式相對於C++gccclang都支持可變長度數組作爲擴展,儘管這實際上是一個C99功能。

您可以建立一個使用-pedantic論點gccclang都將給予警告類似以下內容:

warning: variable length arrays are a C99 feature [-Wvla-extension] 

sizeof有望與VLA正常工作,但將代替評價的整數常量。雖然您的代碼中確實有undefined behavior,因爲您爲size_t指定了錯誤的格式說明符,即zu而不是d。在第7.19.6.1fprintf函數printf的部分是指回到格式字符串款的C99 draft standard說:

如果轉換說明是無效的,其行爲是未定義[...。 ]