2017-03-03 37 views

回答

5

嗯,有太多的差異。首先,閱讀有關arrays are not pointers and vice versa。從可用性來看

這就是說,三大差別(我覺得你有興趣瞭解

  • 數組限制了它的封閉塊一個範圍,但動態除非手動解除分配,否則分配的記憶將會生效因此,函數的本地數組不能是retrun ed,但是通過malloc() -ing返回的指針可以是。

  • 對於非VLA情況下,陣列尺寸必須爲編譯時間常數但對於malloc()在運行時被指定的大小。換句話說,對於數組,您需要知道編譯時的大小,而對於malloc() -ing,完全可以在運行時確定所需的大小。

  • 數組無法重新調整大小。一旦定義,他們使用所需的所有內存大小。根據需要,OTOH是一個malloc() -ed指針,指向一定數量的內存,很可能是realloc() -ed其他數量的內存。

+2

另外,可以通過檢查'malloc()'等的返回值來檢測分配失敗,但是分配靜態數組或VLA的失敗不可檢測AFAIK。 –

0

因爲數組大小應該在編譯時可用,而使用指針可以讓你在運行時確定它的大小。

+1

也許你應該添加「非VLA」。 –

+0

是的,但是VLA只是一個選項。 –

0

this link

動態內存分配允許你的程序,以獲得更多的存儲空間運行時,或者如果它不要求將其釋放。

簡而言之,動態內存分配允許您手動處理程序的內存空間。

Here您還可以讀取靜態分配中所需的內存由編譯器分配,並且在編譯時必須知道存儲的確切大小和類型。另一方面,在動態內存分配中,在運行期間「動態」分配的內存和動態分配的空間通常放置在稱爲堆或自由存儲的程序段中。

0

隨着malloc您使用的大小可以是一個變量!這意味着在執行到達malloc聲明之前,大小可能會根據變量的變化而變化。否則,指定聲明數組的大小必須保持不變。

int foo = 5; 
char bar[foo]; // This will cause a compile error 
char bar[5]; // size is fixed, array size specifiers MUST be constant in C 

void some_func (void) 
{ 
    // do some work that might change foo, e.g. get a value from user 

    char* arr = malloc(foo * sizeof(char)); //foo is variable, thus the size is variable! 
} 

請注意,你說過你說過你用malloc來創建一個數組。這是不正確的。malloc僅僅分配一些連續的內存,給你一個指向內存的開始 - 在技術上這是的一些事,作爲一個陣列(它可以像它在相當多的情況下被使用,但不全部情況)

+0

,但我不能在運行時得到 - 例如 - 一個來自用戶的int,並將其賦值給一個變量(比如x),然後聲明一個數組arr [6]; ? –

+0

不,因爲C語言不允許數組長度以這種方式變化。在這種情況下使用'malloc' *雖然可以通過 – Toby

+0

來實現,但實際上你可以這樣做:'char bar [foo]' –

1

主要區別在於動態分配的內存可根據需要調整大小;數組(靜態,自動或可變長度)在實例化後無法調整大小。

次要的區別與陣列的生存期有關。在文件範圍或static關鍵字聲明的數組的生命週期延長了整個程序的生命週期。在函數或塊中聲明的數組,但不包含關鍵字static的生命期限制在它們的封閉範圍內(這就是爲什麼不能從函數返回指向本地數組的指針 - 數組不再存在當函數退出時爲)。

動態存儲器介於兩者之間 - 其使用期限從最初的*alloc調用延伸到free調用,可能有不同的功能。 直接控制其壽命。

由於內存通常是如何管理auto(本地)變量的,因此自動和可變長度數組通常不能任意大 - 嘗試創建超過兆字節左右大小的本地數組可能會導致流行平臺上的運行時錯誤。您通常在動態分配的內存上沒有這樣的限制。

相關問題