最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

初識(shí)函數(shù)棧幀

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

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

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

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

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

#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;
}

運(yùn)行會(huì)得到亂碼的結(jié)果

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

可是這又是為什么呢?

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

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

return

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

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

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

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

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

然后我們繼續(xù)F11

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

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

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

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

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

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

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

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

相關(guān)文章

最新評論

定远县| 南平市| 北碚区| 苍梧县| 禄丰县| 昌宁县| 边坝县| 千阳县| 惠东县| 桂阳县| 大渡口区| 潜山县| 茶陵县| 定远县| 馆陶县| 宣威市| 柳河县| 山阳县| 扶绥县| 兰西县| 望都县| 百色市| 高碑店市| 甘孜县| 法库县| 东源县| 锡林浩特市| 城固县| 四平市| 安泽县| 石景山区| 永丰县| 抚远县| 三台县| 辉南县| 读书| 章丘市| 海宁市| 新河县| 新巴尔虎右旗| 龙南县|