2014-11-24 105 views
2

我有一個比特的來自未知源複製的代碼:奇怪的C代碼 - 動態數組?

int Len=0; 
printf("Please input the length of vector"); 
scanf("%d",&Len); 
float x[Len],y[Len],sig[Len]; 

現在通常相信數組不能用可變運行時間期間被初始化。不過,據稱這是編譯。問題是我再次不知道編譯器。有沒有一個C變體這是合法的?我正在使用的編譯器IAR C不喜歡它。

我也看到數組索引從1而不是0,這表明這是從帕斯卡原來的東西翻譯。有什麼意見?

+0

爲什麼你認爲它不能? Array不管任何編譯器從0開始。 – SMA 2014-11-24 11:07:35

回答

4

現在通常我認爲數組不能在運行期間用變量初始化。

在C99標準之前就已經如此。這在C++中也是非法的(儘管一些編譯器,如gcc,將其作爲擴展)。

有沒有一個C變體,這是合法的?

任何C99編譯器都可以。

我也看到從1索引的數組,而不是0

這是OK爲好,只要你是精分配一個額外的元素,並且在指數爲零沒有使用的元素。

注意:由於訪問超過數組末尾的元素是未定義的行爲,因此無效的程序可能會在您的測試運行中顯示出工作併產生期望的結果。如果您懷疑某些數組索引可能會被忽略,請考慮在內存分析器(例如valgrind)下運行您的程序,以查看該程序是否存在與無效內存訪問相關的隱藏錯誤。

+0

我認爲c應該是C++的一個子集 – Julius 2014-11-24 11:08:36

+1

@Julius你從哪裏得到這個想法? – 2501 2014-11-24 11:09:38

+0

好的 - 我將檢查我的編譯器設置並確保它與C99兼容。至於從1開始索引的數組,因爲它顯然是可行的,即.exe做它應該做的事情,所以我會離開它。該源本身是一個非法的高斯曲線擬合代碼片。 – 2014-11-24 11:09:58

2

這是C99中引入的功能,稱爲VLA(可變長度陣列)。這些數組也是索引,從0開始,不是1,結束於長度爲1(在您的情況下爲Len-1),就像普通數組一樣。

1

在C99中這是有效的,稱爲VLA陣列。

1

這被稱爲可變長度陣列(VLA)並且是C99特徵。

如果編譯器不能識別它在它自己的再嘗試切換C類標準

嘗試:

--std=c99 
-std=c99 
--std=gnu99 
-std=gnu99 

你的編譯器的手冊頁就能告訴你確切的標誌。