函數調用過程------棧楨ide
例:剖析「比較兩個數之間的大小關係,並把較大數返回」的調用原理:函數
int Max(int x, int y) { int z = 0; if (x > y) z = x; else z = y; return z; } int main() { int a = 10; int b = 20; int c = 0; c = Max(a, b); printf( "%d\n", c); system( "pause"); return 0; }
分析:url
圖一:spa
main函數是被mainCRTStartup調用的,因此main函數棧楨的ebp+1存放的是mainCRTStartup棧楨ebp:3d
觀察上圖mainCRTStartup 的esp=0018ff4c ebp=0018ff88orm
圖二:blog
下面這幅圖是mainCRTStartup調用main的過程,以及main函數棧楨的建立:內存
圖二:get
這幅圖是Max函數棧楨的建立過程:編譯器
圖三:
這幅圖是Max函數調用完成後,Max棧楨的銷燬過程:
整個程序在執行的過程當中,函數的棧楨能夠抽象以下圖,注意,棧是由高地址向低地址走的:
由於棧要對齊,因此編譯器分配的內存若是多了,則就會被浪費。