亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

 更新時間:2022年09月08日 12:06:10   作者:保護小周?  
函數(shù)棧幀(stack frame)就是函數(shù)調用過程中在程序的調用棧(call stack)所開辟的空間,下面這篇文章主要給大家介紹了關于C語言函數(shù)棧幀的創(chuàng)建與銷毀的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

C語言,我們學到了這里,一定會有許多疑惑,我們的代碼邏輯,定義的變量,自定義的函數(shù)等通過編譯器,準確的來講是集成開發(fā)環(huán)境(vs),預處理、編譯、匯編、鏈接,在電腦上執(zhí)行的過程中,計算機內部到底是怎么運行的,我們要搞清楚這些基礎的過程,而不是說,因為這樣做,所以有什么樣的結果,過程是怎么樣的,我們一概不了解,這樣學編程是不對的,要刨根問底,增強自己的內功。保姆級講述,包您一看就會,快來試試吧~

舉個例子:

int main()
{
    int a=0;
    return 0;
}

根據(jù)以上代碼,我們可以讀出一段信息,定義一個局部整型變量 a,并將他初始化為0,同時一個整型變量在內存中占4個字節(jié)。關于main()函數(shù)的返回值啊,簡單說一下,如果返回值為0,則說明程序是正常結束,非0,就是不正常結束,且返回值為整型數(shù)據(jù)。

那么博主在這里問大家兩個問題:

  • 局部整型變量a,到底是怎么創(chuàng)建的?
  • 如果我們對變量a不進行初始化操作,局部變量a的值是多少?
  • main()函數(shù)也有返回值,那他是不是也是也被其他函數(shù)調用?

函數(shù)在調用的過程中棧幀的創(chuàng)建和銷毀對于不同的編譯器來說略有差異,但大體的邏輯是差不多的。取決于編譯器。

 什么是函數(shù)棧幀?

 每一次函數(shù)的調用,操作系統(tǒng)都會在內存的棧區(qū)上開辟一塊空間,稱為棧幀。

函數(shù)調用建立棧幀,棧幀中存儲局部變量,參數(shù)等等。

 

棧區(qū),堆區(qū)等是操作系統(tǒng)這門學科中對內存的劃分,數(shù)據(jù)結構的“棧”,“堆”是存放、處理數(shù)據(jù)的一種結構,跟內存的棧區(qū),堆區(qū),沒有啥關系,但是有一點,數(shù)據(jù)結構的“棧”和內存的棧區(qū)都是后進先出,先進后出的特性。

 舉個例子:

在main() 函數(shù)內部的Sum()函數(shù)則是被 main()函數(shù)調用,Sum()函數(shù)結束開辟的棧幀被操作系統(tǒng)回收,返回mian()函數(shù)的Sum()函數(shù)調用點,繼續(xù)執(zhí)行程序。

程序順序執(zhí)行 ,執(zhí)行main()函數(shù),遇到 int a=1; 操作系統(tǒng)就會在內存的棧區(qū)上,為main()函數(shù)創(chuàng)建棧幀里,給局部變量 a 分配一塊4個字節(jié)的空間。同理,局部變量在那個函數(shù)里創(chuàng)建的,那么就在那個函數(shù)的棧幀中為其分配空間。函數(shù)在調用的時候操作系統(tǒng)會為函數(shù)預劃分一片空間,就是所謂的棧幀,由 esp,ebp 兩個寄存器維護,如果空間不夠了,操作系統(tǒng)會在這片空間的棧頂(esp)增加空間入棧,esp 可以動態(tài)的維護棧頂。

知識點普及:

局部變量是在內存的棧區(qū)上開辟的,棧區(qū)內存的使用習慣是先使用高地址的空間,后使用低地址的空間,棧區(qū)又是一種先進后出,后進先出的結構,且只能在一端操作。

在為函數(shù)創(chuàng)建棧幀的時候,會有很多的寄存器去維護,這一片的可使用空間就會被初始化為隨機值,這個根據(jù)不同的編譯器有不同的初始化方式,這就是我們對局部變量定義的時候不進行初始化打印隨機值的原因。

 由圖可見,棧底寄存器 ebp-0E4h 就等于 edi 指向的空間。

不過現(xiàn)在的編譯器很智能,如果沒有初始化局部變量使用的話會報錯,就很強,但是大家還是要養(yǎng)成良好的初始化的習慣。

Sum() 函數(shù)的調用  

傳參:

把變量a,b 的值分別存儲在 ecx ,eax 寄存器,分別入棧。就相當于使用兩塊空間 又將a,b 存儲了一次。這就是形參嘛。

形參是實參的拷貝!這段形參開辟的空間實際上還是在main() 函數(shù)的棧幀中。esp 棧頂指針動態(tài)維護。

esp ,edp 如何從main() 棧幀,來維護 Sum() 函數(shù)棧幀:

 區(qū)間實際上是(ebx,ebp)

 return 會返回 call 指令的這個地址,可以繼續(xù)執(zhí)行程序。

C/C++ 程序內存分配的幾個區(qū)域:

1.棧區(qū)(stack):在執(zhí)行函數(shù)時,函數(shù)內局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結束時這些存儲單元自動釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限,棧區(qū)主要存放運行函數(shù)而分配的局部變量,函數(shù)參數(shù),返回數(shù)據(jù),返回地址等。

2.堆區(qū)(heap):一般由程序員分配釋放,若程序員不釋放,程序結束時由OS回收。

3.數(shù)據(jù)段(靜態(tài)區(qū))(static)存放全局變量,靜態(tài)變量。程序結束后由系統(tǒng)釋放。

4.代碼段:存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進制代碼

至此C語言函數(shù)棧幀的創(chuàng)建和銷毀博主已經(jīng)分享完了,相信大家對這個函數(shù)怎么建立的、銷毀的,函數(shù)怎么傳參,使用等有了一定的理解,大家可以自己使用匯編代碼,感受一下。

總結

到此這篇關于C語言函數(shù)棧幀的創(chuàng)建與銷毀的文章就介紹到這了,更多相關C語言函數(shù)棧幀內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用C語言編寫一個強制關機程序

    使用C語言編寫一個強制關機程序

    這篇文章主要為大家詳細介紹了如何使用C語言實現(xiàn)一個簡單的"流氓軟件",一個可以強制關機惡作劇關機程序,輸入指定指令才可以解除,感興趣的小伙伴可以學習一下
    2023-11-11
  • C++中對象的賦值與復制操作詳細解析

    C++中對象的賦值與復制操作詳細解析

    對象之間的賦值也是通過賦值運算符“=”進行的。本來賦值運算符“=”只能用來對單個的變量賦值,現(xiàn)在被擴展為兩個同類對象之間的賦值,這是通過對賦值運算符的重載實現(xiàn)的
    2013-10-10
  • c語言打開文件函數(shù)使用方法

    c語言打開文件函數(shù)使用方法

    這篇文章主要介紹了c語言打開文件函數(shù)使用方法,需要的朋友可以參考下
    2014-02-02
  • C語言修煉之路數(shù)據(jù)類型悟正法?解析存儲定風魔上篇

    C語言修煉之路數(shù)據(jù)類型悟正法?解析存儲定風魔上篇

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內存和決定在保留內存中存儲什么
    2022-02-02
  • C++基于easyx圖形庫實現(xiàn)打磚塊游戲

    C++基于easyx圖形庫實現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細介紹了C++基于easyx圖形庫實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明

    C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明

    這篇文章主要介紹了C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言嵌入informix基礎入門示例講解

    C語言嵌入informix基礎入門示例講解

    這篇文章主要介紹了C語言嵌入informix基礎方法,大家參考使用
    2013-11-11
  • C++簡明分析講解引用與函數(shù)提高及重載

    C++簡明分析講解引用與函數(shù)提高及重載

    今天繼續(xù)開始對C++核心編程知識的分享與系統(tǒng)講解,第一,這里會提到“引用”方法傳參以及剖析引用的本質;第二,我們對函數(shù)來一個提高,相當于進階函數(shù)了,包括函數(shù)的默認值,簡單的提一下函數(shù)的占位參數(shù),函數(shù)重載以及注意事項,接下來上正文
    2022-05-05
  • VScode上配置 c語言環(huán)境的圖文教程

    VScode上配置 c語言環(huán)境的圖文教程

    這篇文章主要介紹了配置VScode c語言環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • OpenCV實現(xiàn)拼接圖像的簡單方法

    OpenCV實現(xiàn)拼接圖像的簡單方法

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)拼接圖像的簡單方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論