欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

 更新時間:2021年09月23日 16:03:50   作者:Bitdancing  
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下

初識函數(shù)棧幀

如上圖可見,函數(shù)在被調(diào)用的時候會現(xiàn)在棧上開辟一個空間,我們稱之為棧幀,之后函數(shù)內(nèi)部的變量在這塊區(qū)域進行空間開辟。

但是函數(shù)在調(diào)用的時候,怎么知道需要開辟多大空間呢???

void func()
{
	int a, b;
	double c, d, e;
}

按照示例代碼,會先對需要的內(nèi)存空間大小進行預(yù)估,然后進行空間開辟。

函數(shù)返回時,棧幀會被釋放,但是,雖然棧幀被釋放,里面的內(nèi)容是不會被清空的,下面通過以下的例子進行分析。

#include <stdio.h>
#include <windows>

char* show()
{
	char str[] = "hello world!";
	return str;
}

int main()
{
	char* s = show();
	printf("%s\n", s);
    system("pause");
	return 0;
}

運行會得到亂碼的結(jié)果

看到這里,有些小伙伴肯定會說,嗷,return語句是不可以返回指向棧內(nèi)存的指針的。

可是這又是為什么呢?

于是我按下F11進行調(diào)試。發(fā)現(xiàn)當代碼進行到printf語句行的時候,s指向的內(nèi)容依舊是hello world!。繼續(xù)F10,到14行的時候,printf函數(shù)被調(diào)用,s字符串居然又不存在了!?。?!

其實,printf也是個函數(shù),也會在調(diào)用函數(shù)的時候形成棧幀,會覆蓋曾經(jīng)show棧幀存在的位置,而show棧幀在被釋放之后是無效的。

return

接下來,讓我們把關(guān)注點放到return關(guān)鍵字,同樣的,從代碼出發(fā)~~

誒,那就奇怪了???上面不是說過函數(shù)棧幀會被釋放嗎,那x的值又是怎么被y拿到的呀???

函數(shù)的返回值其實是通過寄存器的方式返回給調(diào)用方的

同樣的,讓我們看看調(diào)試。

這是進入了GetData函數(shù)的匯編語言,eax其實就是寄存器,14行下一行的意思就是把x的內(nèi)容放入寄存器里。

然后我們繼續(xù)F11

回到了main函數(shù),發(fā)現(xiàn)eax會把值再次放入y中。

看到這里是不是恍然大悟了呢?。?!

來看另外一種情況,如果返回的值不被接收呢???

如果返回的值不被接收,GetData后續(xù)沒有處理eax。

個人總結(jié)環(huán)節(jié)

最后,來把知識點系統(tǒng)回顧一遍!

return返回值本質(zhì)上是通過寄存器返回的,如果返回的是一個值,在有變量接收該返回類型的情況下,可以打印該數(shù)據(jù)。如果返回的是一個指針,雖然可以接收到返回的地址,但是原來函數(shù)棧幀存在的位置會被覆蓋,指針所指向的內(nèi)容會在此時被改變。所以說,return語句不可以返回指向棧內(nèi)存的指針,該函數(shù)棧幀在結(jié)束時即被銷毀。

到此這篇關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的文章就介紹到這了,更多相關(guān)C語言之return關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中互斥鎖與自旋鎖及原子操作使用淺析

    C語言中互斥鎖與自旋鎖及原子操作使用淺析

    今天不整GO語言,我們來分享一下以前寫的C語言代碼,來看看互斥鎖、自旋鎖和原子操作的demo,示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2023-01-01
  • C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    這篇文章主要介紹了C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)

    深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)

    這篇文章主要介紹了C++ 結(jié)構(gòu)體與共用體的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C語言超詳細講解循環(huán)與分支語句基礎(chǔ)

    C語言超詳細講解循環(huán)與分支語句基礎(chǔ)

    各位小伙伴們,今天給大家?guī)淼氖茄h(huán)與分支語句,本篇將會向大家介紹這些語句的格式和使用的基本方法,感興趣的朋友來看看吧
    2022-04-04
  • C語言實現(xiàn)火車票管理系統(tǒng)

    C語言實現(xiàn)火車票管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)火車票管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實現(xiàn)經(jīng)典掃雷小游戲的示例代碼

    C語言實現(xiàn)經(jīng)典掃雷小游戲的示例代碼

    掃雷游戲是在一個指定的二維空間里,隨機布置雷,把不是雷的位置都找出來,在你點一個位置的時候它會顯示它周圍全部雷的個數(shù),根據(jù)這個線索去找 ,會更容易贏。本文將用C語言實現(xiàn)這一經(jīng)典游戲,感興趣的可以嘗試一下
    2022-11-11
  • c/c++ 奇技淫巧(一些c語言的技巧)

    c/c++ 奇技淫巧(一些c語言的技巧)

    這篇文章主要介紹了c/c++ 奇技淫巧,需要的朋友可以參考下
    2017-03-03
  • c語言中聯(lián)合體和枚舉用法詳解

    c語言中聯(lián)合體和枚舉用法詳解

    結(jié)構(gòu)體、聯(lián)合體是C語言中的構(gòu)造類型,結(jié)構(gòu)體我們平時應(yīng)該都用得很多,下面這篇文章主要給大家介紹了關(guān)于c語言中聯(lián)合體和枚舉用法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)

    詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)

    這篇文章主要為大家介紹了如何利用Matlab繪制3D版的玫瑰花以及旋轉(zhuǎn)版的3D玫瑰花,文中的示例代碼講解詳細,感興趣的小伙伴可以動手試一試
    2022-03-03
  • 用C++實現(xiàn)推箱子小游戲

    用C++實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了用C++實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論