2013-05-15 29 views
1

我寫了一個程序,其中一個數組的大小作爲用戶的輸入。這是一個有效的C程序嗎?

#include <stdio.h> 
main() 
{ 
    int x; 
    scanf("%d", &x); 
    int y[x]; 
    /* some stuff */ 
} 

該程序未能在我學校的編譯器Turbo C(古董編譯器)上編譯。 但是,當我在我的PC上使用GNU CC進行測試時,它已成功編譯。

所以我的問題是,這是一個有效的C程序?我可以使用用戶的輸入設置數組的大小嗎?

回答

2
c90

不支持可變長度數組可以此使用此命令行看到:

gcc -std=c90 -pedantic code.c 

你會看到這樣的錯誤消息:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla] 

但是c99這是完全有效的:

gcc -std=c99 -pedantic code.c 
3

這是一個有效的C程序,但它不是15年前。

無論哪種方式,這是一個錯誤的C程序,因爲使用x時不知道它有多大。用戶可以輸入x的惡意值,並導致程序崩潰或更糟糕。

+1

現在它是一個有效的程序,但它現在也適用於C編譯器來拒絕它。啊C11和標準委員會鞠躬致敬的噩夢。 –

3

C99爲C程序員提供了使用變長數組的能力,變長數組的大小在運行時間之前是未知的。 --C:一個參考手冊

2

而不是問如果這是嚴格有效的C代碼,最好問問它是否是好的C代碼。雖然它是有效的,但正如你所看到的,一些編譯器不支持可變長度數組。

許多現代編譯器不支持可變長度數組。這些包括Microsoft Visual Studio和一些版本的IBM XL編譯器。正如你所發現的那樣,變長數組不是完全可移植的。如果代碼只能用於支持該功能的系統,而不是必須在其他系統上運行,那很好。相反,使用合理的限制分配具有常量大小的數組可能更好,或者使用malloc自由地以便攜方式創建數組。