亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

DS計劃C深入學習項目:【總結】【變量】變量的

系統 2361 0

如果要加入此計劃 :

1、 方式 1 :加入 QQ 群: 93684322

2、 方式 2 :加入 CSDN 群組: DS 計劃

1.1 變量存儲域

1.1.1 一個示例

pang123hui首先提供了一個網上流傳的學習代碼示例:

int a = 0; //全局區

void main()

{

int b; //棧

char s[] = “abc”; //s在棧,abc在文字常量區

char *p1,*p2; //棧

char *p3 = "123456"; //123456在常量區,p3在棧上

static int c =0; //全局區

p1 = (char *)malloc(10); //p1在棧,分配的10字節在堆

p2 = (char *)malloc(20); //p2在棧,分配的20字節在堆

strcpy(p1, "123456"); //123456放在常量區

}

這個代碼示例中出現了“全局區”,“棧”,“文字常量區”,“堆”等詞語。為了統一,我們使用《C專家編程》中的說法:堆棧段,BSS段,數據段,文本段。

各個段的作用如下:

1、 文本段:包含程序的指令,它在程序的執行過程中一般不會改變。

2、 數據段:包含了經過初始化的全局變量和靜態變量,以及他們的值。

3、 BSS段:包含未經初始化的全局變量和靜態變量。

4、 堆棧段:包含了函數內部聲明的局部變量。

當然,上面段的作用不僅于此,具體的作用會在下面的知識點中介紹。

1.1.2 通過代碼測試變量的存儲位置

Linux下可以通過系統命令“size”查看可以執行程序各個段的大小。但是,可執行程序中的段結構和運行中程序在內存中的段結構并不完全相同,但是有一定的映射關系。具體如下圖所示(圖片信息來自《C專家編程》):

wps_clip_image-696

下面通過代碼示例和“size”來研究變量的存儲區域。

test.c

int main()

{

return 1;

}

編譯,并且查看可執行程序各個段的大小:

wps_clip_image-779

更改test.c:

int g_data;

int main()

{

return 1;

}

編譯,并且查看可執行程序各個段的大小:

wps_clip_image-849

可以發現,文本段,數據段都沒有發送變化,而BSS段增加了4個字節。

結論1:未初始化的全局變量保存在BSS段中

繼續:

int g_data = 1;

int main()

{

return 1;

}

編譯:

wps_clip_image-958

可以發現,BSS段和文本段相同,而數據段增加了4個字節。

結論2:經過初始化的全局變量保存在數據段中

繼續:

int main()

{

static int g_data;

return 1;

}

編譯:

wps_clip_image-1066

可以發現,文本段,數據段都沒有發送變化,而BSS段增加了4個字節。

結論3:未初始化的靜態變量保存在BSS段中

繼續:

int main()

{

static int g_data = 1;

return 1;

}

編譯:

wps_clip_image-1183

可以發現,BSS段和文本段相同,而數據段增加了4個字節。

結論4:經過初始化的靜態變量保存在數據段中

繼續:

int main()

{

int i_data = 1;

return 1;

}

編譯:

wps_clip_image-1288

可以發現,BSS段和和數據段相同,而文本段增加了16個字節。局部變量會在執行的時候在堆棧段中生成,函數執行完畢后釋放。

結論5:函數內部聲明的局部變量保存在堆棧段中

繼續:

const int g_data = 1;

int main()

{

return 1;

}

編譯:

wps_clip_image-1430

把全局變量定義為“const”后,也許你會感到奇怪,怎么BSS段和數據段都沒有發生變化,而文本段卻增加了4個字節。

結論6:const修飾的全局變量保存在文本段中

那么,const的局部變量?

繼續:

int main()

{

const int i_data = 1;

return 1;

}

編譯:

wps_clip_image-1587

結論7:const修飾的局部變量保存在堆棧段中

繼續:

char *pstr = "";

int main()

{

return 1;

}

編譯:

wps_clip_image-1666

在做一下更改:

char *pstr = "123456789";

int main()

{

return 1;

}

編譯:

wps_clip_image-1733

可以發現,前后數據段和BSS段大小均未發生變化,而文本段增加了9個字節。

結論8:字符串常量保存在文本段中

1.1.3 結論

1、 經過初始化的全局變量和靜態變量保存在數據段中。

2、 未經初始化的全局變量和靜態變量保存在BSS段。

3、 函數內部聲明的局部變量保存在堆棧段中。

4、 const修飾的全局變量保存在文本段中,const修飾的局部變量保存在堆棧段中。

5、 字符串常量保存在文本段中。

1.1.4 擴展閱讀

《C專家編程》第6章——詳細介紹各個段的作用。

DS計劃C深入學習項目:【總結】【變量】變量的存儲域


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久免费视频在线观看30 | 在线观看免费亚洲 | 国产一区二区三区视频在线观看 | www.夜夜骑.com | 99视频在线观看免费视频 | 国产精品免费久久久久影院小说 | 青青青草视频在线 | 国产精品二区高清在线 | 天天躁狠狠躁夜躁2021 | 一级毛片私人影院老司机 | 亚洲第一页在线播放 | 亚洲一区二区三区中文字幕 | 久久亚洲国产最新网站 | 成人影院免费在线观看 | 99热这里只有精品在线播放 | 一区二区网站 | 欧美成年黄网站色高清视频 | 伊人在线视频 | 99爱网站| 久久久久久久久影院 | 欧美一级毛片香蕉网 | 中文字幕欧美在线观看 | 精品国产美女 | 欧美激情在线观看一区二区三区 | 99热最新网站地址获取 | 国产尤物视频在线 | 四虎影院在线视频 | 亚洲69av| 国产成人精品综合久久久 | 很黄很色的小视频在线网站 | 五月天亚洲婷婷 | 一级黄色a视频 | 婷婷网五月天天综合天天爱 | 奇米网在线观看 | 国产伦精品一区三区视频 | 亚洲成人在线免费视频 | 国产成人在线视频免费观看 | 一区二区高清视频 | 夜色精品国产一区二区 | 性夜黄a爽爽免费视频国产 性夜影院爽黄a爽免费看网站 | 九九在线偷拍视频在线播放 |