激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - C語(yǔ)言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字

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

2022-01-11 14:51Bitdancing C/C++

在C語(yǔ)言中,一般情況下函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句來(lái)實(shí)現(xiàn)的,每調(diào)用一次return語(yǔ)句只能從函數(shù)中返回一個(gè)值,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下

 

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

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

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

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

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

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

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

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

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

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

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

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

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

可是這又是為什么呢?

于是我按下F11進(jìn)行調(diào)試。發(fā)現(xiàn)當(dāng)代碼進(jìn)行到printf語(yǔ)句行的時(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棧幀在被釋放之后是無(wú)效的。

 

return

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

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

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

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

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

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

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

然后我們繼續(xù)F11

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

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

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

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

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

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

 

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

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

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

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

原文鏈接:https://blog.csdn.net/Joy_Cheung666/article/details/120387700

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91社影院在线观看 | 久久99国产精品视频 | 性欧美日本 | 色综合中文字幕 | 国产精品一区二区三区在线播放 | 中文字幕一区二区三区久久 | 欧美一级棒 | 国产伦精品一区二区三区 | 污片在线观看视频 | 日韩av官网 | 中国杭州少妇xxxx做受 | 国产91免费看 | 亚洲av一级毛片特黄大片 | 最新中文字幕在线 | 成人免费一区二区 | 亚洲嫩草av| 欧美性生视频 | caoporn国产一区二区 | 国产精品久久久久久久久久尿 | 天天夜夜草 | 亚洲精品一区国产精品丝瓜 | 蜜桃网站在线 | 黄色网址免费在线 | 一区二区三区手机在线观看 | 一级片久久免费 | 特级无码毛片免费视频尤物 | 国产精品区在线12p 午夜视频在线免费播放 | 国产一区二区久久精品 | 免费黄色一级网站 | 一区二区三区在线观看免费视频 | 久久草草影视免费网 | 欧洲精品久久 | 久久靖品| 久夜草| 国产亚洲精品久久久久婷婷瑜伽 | 久久在现视频 | 少妇色诱麻豆色哟哟 | 一级毛片免费高清 | 成人在线视频国产 | 日本在线播放一区 | 欧美三级欧美成人高清www |