C 給個求棧最大記憶體的程式

2025-03-10 20:15:14 字數 1163 閱讀 3103

1樓:匿名使用者

這個問題都用匯編才能解釋清楚。

此函式的彙編**是:

7: void func(int i)

004015f7 pop edi

004015f8 pop esi

004015f9 pop ebx

004015fa add esp,40h

004015fd cmp ebp,esp

004015ff call __chkesp (00420a60)00401604 mov esp,ebp

00401606 pop ebp

00401607 ret

以上**最關鍵的地方在於。

11: addr=&i;

004015e2 lea ecx,[ebp+8]004015e5 mov dword ptr [addr (0047cde4)],ecx

即每次遞迴呼叫func前,把引數i的位址儲存到全域性變數addr 中,即每次都把上一次的遞迴函式的堆疊基位址正偏8位元組值記錄了下來,這樣通過前後相鄰兩次遞迴呼叫func的堆疊基位址之差就可以知道每次呼叫func函式所需要的堆疊大小。此遞迴呼叫實際上是個死迴圈,直到耗盡程式所有堆疊空間,程式無法繼續執行時才停止。cout《通過呼叫次數乘以(int)addr-(int)&i的值即可知道程式最大的可用堆疊記憶體大小。

c\c++程式的記憶體分配 堆和棧的區別.ppt

2樓:物理公司的

棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同佔用同一塊記憶體區。

常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多,在《const的思考》一文中,我給出了6種方法)

明確區分堆與棧。

求C語言程式 求兩個整數的最大公約數和最小公倍數

include int yue int a,int b return y int bei int a,int b return y main include int hcf,lcd int main void hcf int u,int v while r u v 0 hcf v void lcd ...

C語言程式填空題,求大神幫忙解答,給個解析,謝謝

這就是數學中的排列組合 每兩個站就需要準備一種車票 這個題應該不考慮去程和返程的區別 所以這個題裡面第乙個空是 i 最後乙個是total total 1 解釋就是這樣 從第乙個站開始,把第2站,第3站,第4站直到最後一站跟它計數 二重迴圈實現 隨後 主站切換到第二站,然後第3站,第4站直到最後一站跟...

C語言題目幫我忙啊,c語言程式的題目,求幫個忙

1.b c,因為w不是三維陣列 2.b,因為scnaf 裡的x i 相當於 x i 0 c語言程式的題目,求幫個忙 請採納 include define n 5 int main else if a i 修改一下分類就成c語言就會有程式設計師回答了。有個c語言題目不會做幫下忙.include mai...