2016-07-29 134 views
0

每當我需要創建一個數組,其中有許多元素直到執行時間才知道,我這樣做。正在創建具有可變數量元素的數組嗎?

int n, i; 
printf("Number of elements: "); 
scanf("%d", &n); 
int myArray[n]; 
for(i = 0; i < n; i++) 
    myArray[i] = 0; 

不過我已經告訴3人與計算機科學博士學位不這樣做,因爲「它不能保證在每個編譯工作」,而該元素的數組數必須在編譯時知道。所以他們這樣做。

int myArray[1000]; 
int n, i; 
printf("Number of elements: "); 
scanf("%d, &n); 
//we must stop at the n element 
for(i = 0; i < n; i++) 
    myArray[i] = 0; 

我應該使用哪一個?何時不能保證工作?這只是一種記憶浪費或需要維持遺產嗎?

+0

如果要在C中實現動態數組,請使用動態內存分配。 –

+2

都不是。使用類似'int * myArray = malloc(n * sizeof * myArray);'的方法,並在完成後進行清理。 – WhozCraig

+0

它完全符合C99版本的標準。它被稱爲可變長度數組(VLA)。由於一些不知道的原因,委託人在當前版本(C11)中使VLA成爲可選項 - 不惜一切代價向後兼容。我仍然建議使用它。現代桌面編譯器將支持它(例如gcc和clang)。不要使用過時的編譯器如MSVC。他們在現代C方面也有其他問題。有時候需要剪一個。 WQe不再使用馬車。或莫爾斯電子郵件。您的博士應該繼續 – Olaf

回答

1

「它不能保證在每個編譯工作」

是的,基本上是正確的。

第一種方法VLA, variable length arrayC99標準的一部分。但是,

  • C11,這已被製成可選。你最好不要依賴這個功能。
  • C89沒有那個作爲標準的端口。然而,支持它們的是gcc擴展。

引用C11,章§6.7.6.2/ P5

[....]如果尺寸是整數常量表達式 和元素類型具有已知的恆定大小,陣列類型不是可變長度 數組類型;否則,數組類型是可變長度數組類型。 (可變長度 陣列是一個條件的功能,實現方式不需要支持;參見6.10.8.3)

作爲一個替代方法,可以始終使用一個指針和動態存儲器分配等malloc()和家庭,如果你必須依賴運行時間值。

總之,要回答這個問題

是可能的元素數量可變的創造陣列?

這是可能的,但只有VLA支持。沒有這些,最好的情況是你必須使用指針和內存分配函數。

+0

嗨Sourav!我強烈反對你的結論,不使用VLA。僅僅因爲仍然有人使用馬車並不意味着所有的高速公路都應該具有20公里/小時的速度限制。有足夠的現代編譯器支持C99,從而支持VLA。不支持C99 /完整C11的編譯器可能不支持其他功能,在現代C中也是如此。C似乎是唯一一種堅持27年版本的語言,僅僅是因爲人們拒絕學習新的東西並要求他們的現代特徵供應商。 – Olaf

+1

@Olaf先生,謝謝你的評論。首先,我不反對VLA,我只是試圖建議爲_alternative_,正如你所看到的。其次,我試圖爲它們中的每一個指定編譯器支持。如果您認爲我的回答有任何偏見,請提出修改措辭或隨意修改。 :) –

+0

動態分配是**不是**一般替代VLA。不僅功能對大多數實現不可用 - 而且大多數實現都是獨立的,沒有標準庫中不需要的部分。然後,如果你需要多維數組,它們是不可用的,因爲如果你使用動態分配,你需要一個指向2D的VLA。 – Olaf

1

如果你想要的東西,是C89兼容,並且不使用太多的內存,還有它是動態分配內存第三種選擇:

int n, i; 
printf("Number of elements: "); 
scanf("%d", &n); 
int *myArray = malloc(sizeof(int)*n); // allocate space for n ints 
if (myArray == NULL) { 
    perror("malloc failed"); 
    exit(1); 
} 
for(i = 0; i < n; i++) 
    myArray[i] = 0; 

只是一定要打電話free上分配的內存當你完成它。

+2

....並且測試從'malloc'返回的文件# – KevinDTimm

+2

....並且,如果OP要清除內存,爲什麼不使用'calloc' – KevinDTimm

+0

@dbush我總是使用指針和malloc每當我需要改變大小dinamically,在這種情況下,我不知道。在使用MinGW和c89編譯器標誌時,它是第一種方式。爲什麼我應該使用它呢? (什麼是「好處」) – Sheldon

相關問題