我們知道C語言中,每個棧幀對應著一個未運行完的函數。棧幀中保存了該函數的返回地址和局部變量。棧幀也叫過程活動記錄,是編譯器用來實現函數調用的一種數據結構。那麼在Linux下gcc編譯器棧幀是怎麼實現的呢?
首先先來看一段程序:
猜猜程序運行的結果是什麼?你會發現你的系統會立馬重啟。這是為什麼呢,這就是程序運行的堆棧在作怪!!
下邊這張圖會讓你很清楚的理解
分析:
1、首先函數在傳參的時候使用的是值傳遞,在fun1中使用的參數並不是真正的參數,而是臨時拷貝。
2、p得到參數a的地址,並且--得到call指令的下一條指令,p=fun()使得當前函數運行完成之後就,運行fun()函數。
那麼現在再來看一看如何通過不使用b變量,來改變它的值
運行結果:
就這樣講b變量的值改變
有什麼不足之處,希望大家批評指正