色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言函數調用過程中的內存變化解析

電子設計 ? 來源:TOMORROW 星辰 ? 作者:TOMORROW 星辰 ? 2020-12-11 16:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相信很多編程新手村的同學們都會有一個疑問:C 語言如何調用函數的呢?局部變量的作用域為什么僅限于函數內?這個調用不是指C 語言上的函數調用的語法,而是在內存的視角下,函數的調用過程。本文將從C 語言調用實例,內存視角,反匯編代碼來探討C 語言函數的調用過程,也可以說是C 語言函數調用過程圖解。通過這個C 語言函數調用過程圖解,同學們將會知道,C 語言函數在調用時,內存空間是怎樣變化的。

要想理解這一個過程還好涉及到函數棧幀的概念。函數棧幀指的是,在調用函數時,系統在棧空間中給函數所分配的一段連續空間。其中 ebp(棧幀基址指針)則是指明了當前函數的棧幀基地址,對函數的資源(局部變量、實參等)的訪問,都要通過 ebp+offset(偏移量)來進行訪問。而 esp 則是棧指針,指示當前棧空間棧頂的位置。

以下代碼即是此次探討 C 語言函數調用過程的實例源碼:

intsubFunc(intabc)
{
intdef=0x9999;
abc=0x8888;
returnabc;
}

int_tmain()
{

subFunc(0x2222);

return0;
}

源碼很簡單,在一個主函數中,調用一個帶參數的子函數。源碼使用 Visual Studio2010 進行調試,并同時查看內存窗口、反匯編窗口及變量窗口。

進入調試模式,并將斷點定在調用子函數 subFunc()處,然后運行并觀察。

通過觀察窗口,可以知道,此時還是在執行 main 函數,而 ebp(棧幀基址指針)指向的是 0x0073fb64,esp=0x0073fa98。從反匯編代碼可以看到,在調用函數前,需要先將參數壓棧,也就是將實參存到了 0x0073fa94 處,然后再調用到子函數。

進入到子函數時,esp 已經變成了 0x0073fa8c,而 0x0073fa90 處存放的是,子函數執行完后返回到 main 函數中的地址。進入到子函數后,先將 main 函數的 ebp 壓棧,然后將當前棧頂指針的值賦值給 ebp 作為當前子函數的 subFunc()的棧幀基址指針。此時 esp 和 ebp 都變成了 0x0073fa8c。

緊接著,可以看到,esp 一下子被減去了 0x0cch,也就是說棧空間一下子增長了 0x0cch,并且這段空間全部被賦值為 0xcc。再往下看,可以看到子函數中的局部變量被分配在了 0x0073fa84 處(因為變量是 32 位的,然后 CPU 卻是 64 位的,所以空了 32 位不作使用),也就是說,這一段被初始化為 0xcc 的棧空間是被用來給局部變量分配空間的。

接下來再看,在 main 函數傳遞了一個實參 0x2222 給子函數 subFunc 中的形參 abc。在對 abc 進行讀寫時,其實就是在對前面實參所被存儲的空間進行讀寫,也就是說形參在作為參數也作為局部變量的同時,它所被分配的內存空間是在函數棧幀基址 ebp 之下。

而子函數被執行完后,返回的過程則是一個與上面過程相逆的過程。將相應的數據出棧,恢復 ebp 等信息,釋放子函數的棧空間,返回到主函數。所以局部變量的作用域只是在函數中,當函數被執行完返回時,函數的棧幀都被釋放了,局部變量等數據也就沒有了,不存在了,也就是說局部變量的生命周期是與函數的生命周期等同的。

經過以上的 C 語言函數調用過程圖解,相信已經理解了 C 語言在內存中是如何調用的了。然后可以總結并得出下面的函數調用的棧幀圖解。從函數調用的層面看,棧空間是被從下往上一塊一塊地增長的,并且是后分配的先被釋放,先分配的后被釋放。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3117

    瀏覽量

    75156
  • C語言
    +關注

    關注

    180

    文章

    7631

    瀏覽量

    141159
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 逆天而行amp1

評論

相關推薦
熱點推薦

C語言使用函數調用的知識點

C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存
發表于 09-07 11:47 ?1031次閱讀

C語言內存知識總結:memset函數和calloc函數

memset(翻譯:清零)是計算機C/C++語言初始化函數。作用是將某一塊內存
發表于 10-24 10:40 ?1373次閱讀

C函數調用機制與棧幀原理詳解

當一個C函數調用時,函數的參數如何傳遞、堆棧指針如何變化、棧幀是如何被建立以及如何被消除的,一直缺乏系統性的理解,因此決定花時間學習下
發表于 06-08 10:49 ?1954次閱讀
<b class='flag-5'>C</b><b class='flag-5'>函數</b><b class='flag-5'>調用</b>機制與棧幀原理詳解

ARM函數調用過程說明

ARM函數調用默認4個參數用R0-R4傳遞,大于4個用堆棧傳遞,局部變量保存在堆棧,下面以一個簡單的函數來說明這個過程。先定義
發表于 04-26 10:05

ARMv8的函數調用棧是什么意思?調用棧的內存管理是怎樣的

調用解析概念: 任意體系結構的CPU,都設計了一套通用寄存器、狀態寄存器及其他控制寄存器,用以維系系統的正常運行。函數調用過程中,CPU一般都需要處理幾件事情:保存母
發表于 05-13 10:36

C++教程之函數的遞歸調用

C++教程之函數的遞歸調用 在執行函數 f 的過程中,又要調用 f
發表于 05-15 18:00 ?35次下載

C語言入門教程-malloc函數和free函數

malloc函數和free函數 假設您的程序在執行過程中需要分配一定量的內存。您可以隨時調用malloc
發表于 07-29 11:58 ?4721次閱讀

系統調用函數庫分析及實例

作為用戶我們極少接觸系統調用,但是我們熟悉C 語言,對庫函數調用并不陌生。C
發表于 06-23 16:46 ?46次下載
系統<b class='flag-5'>調用</b><b class='flag-5'>函數</b>庫分析及實例

使用過程仿真函數模擬PID控制的過程

設定循環時間為200ms。例如OB31 2) 在OB31調用PID函數PID_compact,然后在全局庫打開庫文件《Sim_controllprocess_V13_SP1》,并
的頭像 發表于 05-27 17:31 ?4306次閱讀

C語言代碼調用匯編函數需要注意什么

來看下混合語言工程,就比如在匯編程序調用C函數,或者在C
的頭像 發表于 11-12 11:04 ?3082次閱讀

C語言使用函數調用在內存究竟發生了什么?

C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存
的頭像 發表于 01-13 14:09 ?1568次閱讀

RPC如何在遠程過程中調用

RPC(Remote Procedure Call Protocol)即遠程過程調用,也就是調用函數是在其它的控制板上運行的,不需要理會底層的通訊協議。
的頭像 發表于 02-07 09:52 ?1137次閱讀
RPC如何在遠程<b class='flag-5'>過程中</b><b class='flag-5'>調用</b>?

C語言函數調用的形式及過程

C語言函數調用時的數據傳遞 在調用有參函數時,主調函數
的頭像 發表于 03-10 14:28 ?2260次閱讀

什么是函數調用

函數調用,就是使用我們已經定義好的函數,或者C語言自帶的庫函數
的頭像 發表于 04-04 17:21 ?6544次閱讀

EE-128:C語言中的DSP:從C調用匯編類成員函數

電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
發表于 01-07 13:48 ?0次下載
EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的DSP:從<b class='flag-5'>C</b><b class='flag-5'>調用</b>匯編類成員<b class='flag-5'>函數</b>
主站蜘蛛池模板: 精品无码三级在线观看视频 | 女性爽爽影院免费观看 | 99国内精品久久久久久久清纯 | 国产美女久久久久久久久久久 | 台湾佬休闲中性娱乐网 | 好男人免费观看在线高清WWW | 天堂精品国产自在自线 | 蜜桃色欲AV久久无码精品 | 国产亚洲精品久久久久久白晶晶 | 亚洲欧美综合在线中文 | 麻豆精品无码久久久久久久久 | 久久精品99热超碰 | 女警被黑人20厘米强交 | 啊灬啊别停灬用力啊在线观看视频 | 无码乱人伦一区二区亚洲 | 亚洲日韩在线天堂一 | 成人区在线观看免费视频 | 日本亚洲精品无码区国产电影 | ASIAN大陆明星裸休合成PICS | 国产精品成人观看视频免费 | 月夜直播免费看 | 久久精品黄色 | a一级毛片视频免费看 | 肉蒲团从国内封禁到日本成经典 | 美女被强奷到抽搐的动态图 | 亚洲国产中文字幕新在线 | 囯产精品一区二区三区线 | 国产成人教育视频在线观看 | 久久综久久美利坚合众国 | 国偷自产视频一区二区久 | 午夜不卡久久精品无码免费 | 欧美亚洲曰韩一本道 | 69精品国产人妻蜜桃国产毛片 | 口内射精颜射极品合集 | 99久久热视频只有精品 | 啊好大好厉害好爽真骚 | 国产精品99久久久久久AV | 久久国产加勒比精品无码 | 国产精品久久国产三级国不卡顿 | 长泽梓黑人初解禁bdd07 | 韩国三级久久精品 |

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品