是什麼malloc()
-ed陣列和規則排列的區別時,在這兩個我必須指定內存大小,例如當我必須指定內存大小時,malloc數組和常規數組之間有什麼區別?
char* arr = malloc(50 * sizeof(char))
VS
int arr [50]
是什麼malloc()
-ed陣列和規則排列的區別時,在這兩個我必須指定內存大小,例如當我必須指定內存大小時,malloc數組和常規數組之間有什麼區別?
char* arr = malloc(50 * sizeof(char))
VS
int arr [50]
嗯,有太多的差異。首先,閱讀有關arrays are not pointers and vice versa。從可用性來看
這就是說,三大差別(我覺得你有興趣瞭解)
數組限制了它的封閉塊一個範圍,但動態除非手動解除分配,否則分配的記憶將會生效因此,函數的本地數組不能是retrun
ed,但是通過malloc()
-ing返回的指針可以是。
對於非VLA情況下,陣列尺寸必須爲編譯時間常數但對於malloc()
在運行時被指定的大小。換句話說,對於數組,您需要知道編譯時的大小,而對於malloc()
-ing,完全可以在運行時確定所需的大小。
數組無法重新調整大小。一旦定義,他們使用所需的所有內存大小。根據需要,OTOH是一個malloc()
-ed指針,指向一定數量的內存,很可能是realloc()
-ed其他數量的內存。
另外,可以通過檢查'malloc()'等的返回值來檢測分配失敗,但是分配靜態數組或VLA的失敗不可檢測AFAIK。 –
因爲數組大小應該在編譯時可用,而使用指針可以讓你在運行時確定它的大小。
也許你應該添加「非VLA」。 –
是的,但是VLA只是一個選項。 –
隨着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
僅僅分配一些連續的內存,給你一個指向內存的開始 - 在技術上這是不的一些事,作爲一個陣列(它可以像它在相當多的情況下被使用,但不全部情況)
,但我不能在運行時得到 - 例如 - 一個來自用戶的int,並將其賦值給一個變量(比如x),然後聲明一個數組arr [6]; ? –
不,因爲C語言不允許數組長度以這種方式變化。在這種情況下使用'malloc' *雖然可以通過 – Toby
來實現,但實際上你可以這樣做:'char bar [foo]' –
主要區別在於動態分配的內存可根據需要調整大小;數組(靜態,自動或可變長度)在實例化後無法調整大小。
次要的區別與陣列的生存期有關。在文件範圍或static
關鍵字聲明的數組的生命週期延長了整個程序的生命週期。在函數或塊中聲明的數組,但不包含關鍵字static
的生命期限制在它們的封閉範圍內(這就是爲什麼不能從函數返回指向本地數組的指針 - 數組不再存在當函數退出時爲)。
動態存儲器介於兩者之間 - 其使用期限從最初的*alloc
調用延伸到free
調用,可能有不同的功能。 您直接控制其壽命。
由於內存通常是如何管理auto
(本地)變量的,因此自動和可變長度數組通常不能任意大 - 嘗試創建超過兆字節左右大小的本地數組可能會導致流行平臺上的運行時錯誤。您通常在動態分配的內存上沒有這樣的限制。
'char'和'int'是完全不同的類型......並且您不會將蘋果與桔子進行比較,無論如何。 –
你是什麼意思 - 有什麼區別?問題還不清楚 – KevinDTimm