一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

易錯、經(jīng)典問題:return不可返回指向棧內(nèi)存的指針!

 嵌入式大雜燴 2021-08-20

預(yù)備知識:內(nèi)存的分類

C/C++程序占用的內(nèi)存分為兩大類:靜態(tài)存儲區(qū)動態(tài)存儲區(qū)。其示意圖如下所示:

數(shù)據(jù)保存在靜態(tài)存儲區(qū)與動態(tài)存儲區(qū)的區(qū)別就是:靜態(tài)存儲區(qū)在編譯-鏈接階段已經(jīng)確定了,程序運行過程中不會變化,只有當(dāng)程序退出的時候,靜態(tài)存儲區(qū)的內(nèi)存才會被系統(tǒng)回收。動態(tài)存儲區(qū)是在程序運行過程中動態(tài)分配的。

在其它地方我們還可以看到內(nèi)存分配還有其他分類,那些都是細(xì)分的分類,比如文字常量區(qū)、全局?jǐn)?shù)據(jù)區(qū)等,都?xì)w為靜態(tài)存儲區(qū)這一個大類。

關(guān)于內(nèi)存的分類這里只是大致說一下,關(guān)于內(nèi)存更詳細(xì)的內(nèi)容可查看往期筆記:【C語言筆記】內(nèi)存總結(jié)

例子:return返回指向棧內(nèi)存指針

先看一個return返回指向棧內(nèi)存指針的例子:

#include <stdio.h>

char *GetStr(void)
{
    char p[] = "Hello"/* 保存在棧中 */
    return p;
}

int main(void) 
{
    char *str = NULL;
    str = GetStr();
    printf("%s\n", str);
    return 0;
}

程序編譯、運行的結(jié)果如下:

可以看到,編譯出現(xiàn)警告:

warning: function returns address of local variable

運行結(jié)果并不是我們期望的輸出字符串Hello。

那是因為GetStr函數(shù)返回指向棧內(nèi)存的指針,這里的變量p是局部變量,而局部變量是分配在棧上的。即Hello保存在棧內(nèi)存上,棧內(nèi)存在函數(shù)調(diào)用結(jié)束時會自動銷毀,因此此時的p里的內(nèi)容是未知的,所以結(jié)果無輸出。

下面我們把GetStr函數(shù)修改為:

char *GetStr(void)
{
    char *p = "Hello";  /* p在棧上,Hello在靜態(tài)區(qū)(常量區(qū)) */
    return p;
}

此時編譯運行的結(jié)果是怎樣的呢?結(jié)果為:

可以看到能正常輸出。為什么這里又可以正常輸出呢?因為這里的p雖然分配在棧上,但是此時的Hello是一個字符串常量,其存儲在靜態(tài)存儲區(qū)。在調(diào)用GetStr函數(shù)結(jié)束時其也不會被銷毀。

這里可能有些人會有疑惑,同樣是Hello,為什么一個在棧上,一個在靜態(tài)區(qū)。

char *p = "Hello";

此處首先定義了一個指針變量p,編譯器就會為指針變量開辟了??臻g。而此時并沒有空間來存放Hello,所以Hello只能存儲在靜態(tài)區(qū)。

char p[] = "Hello";

此處首先定義一個數(shù)組p,因為未給出數(shù)組大小,所以此時數(shù)組大小未確定。然后把Hello保存在這個數(shù)組里,編譯器就會為數(shù)組p開閉足夠的??臻g來存儲Hello。

相關(guān)筆記:char *str與char str[]的區(qū)別

其它替代方法

從上面的例子我們知道,若函數(shù)返回指向棧內(nèi)存的指針,所得到的結(jié)果并不是我們想要的。除了上面的方法之外,這里還有如下幾種解決方法:

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    午夜国产成人福利视频| 黄色国产自拍在线观看| 久久精品国产亚洲av麻豆| 国产精品午夜视频免费观看| 国产真人无遮挡免费视频一区| 亚洲人午夜精品射精日韩| 99久久精品国产麻豆| 国产又粗又硬又长又爽的剧情| 欧美黑人在线一区二区| 国内九一激情白浆发布| 久久精品国产99精品亚洲| 妻子的新妈妈中文字幕| 国产超薄黑色肉色丝袜| 久久国产精品亚州精品毛片| 亚洲性日韩精品一区二区| 欧美人禽色视频免费看| 日本 一区二区 在线| 国产欧美日韩综合精品二区| 亚洲精品欧美精品一区三区| 深夜福利欲求不满的人妻| 千仞雪下面好爽好紧好湿全文| 亚洲中文字幕高清视频在线观看| 色偷偷亚洲女人天堂观看| 亚洲国产黄色精品在线观看 | 九七人妻一区二区三区| 中文字幕中文字幕在线十八区 | 国产精品成人又粗又长又爽| 亚洲黑人精品一区二区欧美| 亚洲精品欧美精品日韩精品| 久久综合狠狠综合久久综合| 国产一区二区不卡在线视频| 高清不卡一卡二卡区在线| 国产精品二区三区免费播放心| 加勒比系列一区二区在线观看| 国产又大又硬又粗又湿| 丰满人妻熟妇乱又伦精另类视频| 最近最新中文字幕免费| 亚洲妇女作爱一区二区三区| 日韩高清中文字幕亚洲| 四季精品人妻av一区二区三区| 国产午夜福利在线免费观看|