3 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
這里有幾個(gè)不同的作品。
第一個(gè)是將數(shù)組聲明為的區(qū)別
int array[n];
和
int* array = malloc(n * sizeof(int));
在第一個(gè)版本中,您聲明一個(gè)具有自動(dòng)存儲(chǔ)持續(xù)時(shí)間的對(duì)象。這意味著只要存在調(diào)用它的函數(shù),該數(shù)組就會(huì)存在。在第二個(gè)版本中,您將獲得具有動(dòng)態(tài)存儲(chǔ)持續(xù)時(shí)間的內(nèi)存,這意味著它將一直存在,直到它被顯式釋放free
。
第二個(gè)版本在這里工作的原因是如何編譯C的實(shí)現(xiàn)細(xì)節(jié)。通常,C內(nèi)存分為幾個(gè)區(qū)域,包括堆棧(用于函數(shù)調(diào)用和局部變量)和堆(用于malloc
ed對(duì)象)。堆棧的大小通常比堆小得多; 通常它是8MB的東西。因此,如果您嘗試分配一個(gè)巨大的數(shù)組
int array[n];
然后,您可能會(huì)超出堆棧的存儲(chǔ)空間,從而導(dǎo)致段錯(cuò)誤。另一方面,堆通常具有巨大的大?。ɡ?,系統(tǒng)上空閑的空間),因此malloc
大型對(duì)象不會(huì)導(dǎo)致內(nèi)存不足錯(cuò)誤。
通常,要注意C中的可變長(zhǎng)度數(shù)組。它們很容易超過堆棧大小。malloc
除非您知道尺寸很小或者您確實(shí)只想要在短時(shí)間內(nèi)使用該陣列,否則請(qǐng)首選。
希望這可以幫助!

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
int list[n]
為堆棧n
上的整數(shù)分配空間,這通常很小。使用堆棧上的內(nèi)存比替代方法快得多,但是它非常小并且如果您執(zhí)行諸如分配大型數(shù)組或過度遞歸之類的操作,則很容易溢出堆棧(即分配太多內(nèi)存)。您不必手動(dòng)釋放以這種方式分配的內(nèi)存,它是在陣列超出范圍時(shí)由編譯器完成的。
malloc
另一方面,在堆中分配空間,與堆棧相比通常非常大。您將不得不在堆上分配更大量的內(nèi)存來耗盡它,但是在堆上分配內(nèi)存比在堆棧上分配內(nèi)存要快得多,并且必須free
在完成使用后手動(dòng)取消分配它。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
int list [n]將數(shù)據(jù)存儲(chǔ)在堆棧中,而malloc將其存儲(chǔ)在堆中。
堆棧是有限的,并沒有太多的空間,而堆更大。
- 3 回答
- 0 關(guān)注
- 1595 瀏覽
添加回答
舉報(bào)