第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

數(shù)組類型和使用malloc分配的數(shù)組之間的區(qū)別

數(shù)組類型和使用malloc分配的數(shù)組之間的區(qū)別

C
蠱毒傳說 2019-08-26 19:11:24
數(shù)組類型和使用malloc分配的數(shù)組之間的區(qū)別今天我用一些C代碼幫助了我的一個(gè)朋友,我發(fā)現(xiàn)了一些奇怪的行為,我無法解釋他為什么會(huì)發(fā)生這種行為。我們有一個(gè)帶有整數(shù)列表的TSV文件,每行都有一個(gè)int。第一行是列表的行數(shù)。我們還有一個(gè)非常簡(jiǎn)單的“readfile”的ac文件。第一行讀到n,行數(shù),然后有一個(gè)初始化:int list[n]最后是一個(gè)帶有fscanf的n循環(huán)。對(duì)于小n(直到~100,000),一切都很好。但是,我們發(fā)現(xiàn)當(dāng)n很大(10 ^ 6)時(shí),會(huì)發(fā)生段錯(cuò)誤。最后,我們將列表初始化更改為int *list = malloc(n*sizeof(int))一切都很好,即使是非常大的n。有人能解釋為什么會(huì)這樣嗎?什么導(dǎo)致了segfault [n]的段錯(cuò)誤,當(dāng)我們開始使用list = malloc(n * sizeof(int))時(shí)停止了?
查看完整描述

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)用和局部變量)和堆(用于malloced對(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)首選。

希望這可以幫助!


查看完整回答
反對(duì) 回復(fù) 2019-08-26
?
慕虎7371278

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)取消分配它。


查看完整回答
反對(duì) 回復(fù) 2019-08-26
?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

int list [n]將數(shù)據(jù)存儲(chǔ)在堆棧中,而malloc將其存儲(chǔ)在堆中。

堆棧是有限的,并沒有太多的空間,而堆更大。


查看完整回答
反對(duì) 回復(fù) 2019-08-26
  • 3 回答
  • 0 關(guān)注
  • 1595 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)