這個問題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返回給調用者。