[英]What is the difference between malloc array and regular array when in both I have to specify memory size?
例如,當我必須指定內存大小時, malloc()
ed數組和常規數組之間有什么區別?
char* arr = malloc(50 * sizeof(char))
與
int arr [50]
好吧,差異太多了。 首先,了解數組不是指針,反之亦然 。
也就是說,從可用性角度來看( 我覺得您對此很感興趣 )有三個主要差異
數組的范圍僅限於其封閉塊,但是動態分配的內存有效,除非手動釋放。 所以,數組函數的局部不能retrun
ED但一個指針,經由返回malloc()
-ing,都可以。
對於非VLA ,數組大小必須是編譯時常數,但對於malloc()
大小在運行時指定。 換句話說,對於數組,您需要在編譯時知道大小,而對於malloc()
ing,則完全有可能在運行時確定請求的大小。
數組無法調整大小。 定義后,它們將使用其大小所需的所有內存。 OTOH,一個指向malloc()
指針,指向一定數量的內存,可以根據需要將realloc()
ed指向其他一些內存。
主要區別在於可以根據需要調整動態分配的內存的大小。 數組(靜態,自動或可變長度)一旦實例化就無法調整大小。
次要差異與陣列的壽命有關 。 在文件作用域或使用static
關鍵字聲明的數組的生存期可以延長到程序的生存期。 在沒有 static
關鍵字的函數或塊中聲明的數組的生存期受限於其封閉范圍(這就是為什么您不能從函數返回指向本地數組的指針的原因-當函數運行時該數組不再存在退出)。
動態內存介於兩者之間-它的生存期從最初的*alloc
調用一直延伸到free
調用, free
調用的功能可能不同。 您可以直接控制其壽命。
由於經常為auto
(本地)變量管理內存,因此自動數組和可變長度數組通常不能任意大-嘗試創建大小超過兆字節左右的本地數組可能會導致運行時錯誤熱門平台。 您通常對動態分配的內存沒有這種限制。
因為in數組的大小應在編譯時可用,而使用指針可以讓您在運行時確定其大小。
使用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
僅僅分配一些連續的內存,給你一個指向內存的開始-在技術上這是不是有些事,作為一個陣列(也可以使用,如果它是在相當多的情況下,但不是所有的情況下)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.