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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c語言中分配一個很大的數組,運行時段錯誤

c語言中分配一個很大的數組,運行時段錯誤

BIG陽 2019-04-21 20:20:13
intmain(intargc,charconst*argv[]){intj;inta[100000000];for(j=0;j
查看完整描述

2 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

這個問題101了。這么大的數組炸棧是肯定的。
棧內存一般而言由系統(tǒng)的約束和配置決定,一般來說默認的在1-8M每進程不等。linux和macosx一般可以用ulimit命令調節(jié),但一般仍會受到操作系統(tǒng)的“硬限制”而不能想調多大調多大。
關于系統(tǒng)棧:
系統(tǒng)棧的目的,在于跟蹤和追溯函數調用的歷史。
這里的函數尤其指每個函數都有功能上的意義,即打印出系統(tǒng)棧就能表示出程序有意義的功能分塊。
使用棧內存做算法,不是不好,不過和系統(tǒng)棧的慣例用法畢竟稍微有一點偏差。
層級很深,但每個層級都很類似(單獨提取出來,無甚分析價值)的深層搜索,無論是為了防止炸棧,還是為了保持調用棧的簡潔可分析,都應當自己建立用戶棧。
關于棧內存:
棧內存整批進、整批退,不存在碎片和管理問題,性能優(yōu)于堆內存。
但相應的代價就是:
其一,比較少,寸土寸金;
其二,函數結束(退棧)之后,棧頂退回函數執(zhí)行前的位置,則函數中所有局部變量所在的棧內存落在棧外自然銷毀。(重要)
因此函數內的局部變量,只應當表示函數內部執(zhí)行到了什么狀態(tài),絕對不能用作實質性的數據區(qū)域。
例如:應當用局部變量表示緩沖區(qū)的下標、指針,但緩沖區(qū)本身絕對不應該開在棧上。
數據區(qū)域要么從堆上分配獲得指針,要么通過參數傳遞得到指針。
事實上這里用全局變量也不是唯一的選擇(至少全局變量在語義上還是不太好看)。也可以使用malloc()來做,獲取按需分配內存的靈活性,不必事前規(guī)定一個“足夠大的范圍”:
intn,i;
int*a,*p;
scanf("%d",&n);
a=malloc(sizeof(int)*n);
p=a;
for(i=0;i{
scanf("%d",p++);
}
題外話——“局部變量所在的棧內存區(qū)域自然銷毀”這件事,坑死多少C程序員。這里不詳細展開,但請一定小心不要撞這個常識性的錯誤,即:不要把任何局部變量的地址用return返回給調用者。
                            
查看完整回答
反對 回復 2019-04-21
  • 2 回答
  • 0 關注
  • 416 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號