日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C 程序的存储空间记录

發布時間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C 程序的存储空间记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 一直以來,我們只是單純的去運行執行 C 程序,并沒有關心這個可執行文件里面包含著什么東西。

  • 參考UNIX 環境高級編程 7.6,記錄C程序的存儲空間布局。

  • C程序由 正文段,初始化數據段,非初始化數據段,棧,堆組成

  • 正文段,初始化數據段,非初始化數據段(bss)

正文段:CPU執行的機器指令部分。 初始化數據段:通常將此段稱為數據段,包含了程序中需明確的賦初始值的變量。比如說,c 程序中出現在任何函數之外的聲明。靜態變量都在 初始化數據段:static int i = 1000;全局變量int test = 100; 非初始化數據段: 一般我們稱為 bss 段,這一名稱來源于早期的匯編運算符,意思是 block started by symbol , 在程序開始執行之前,kernel 會將這個 bss 段中的數據全部初始化為0或者是空指針。比如說:未初始化局部變量:static int chen;全局變量:ing test1[100];
  • 寫一段簡單的代碼,看一下上面的內存分布, 名字是test.c:

#include <stdio.h> void test(void) { printf("This is test function\n"); } int main(void) { printf(" This is main function\n"); return 0; } 看一下這個代碼生成可執行文件的各個內存分布:sbc_7109_454_pdk3@aplex:~/test/c_program$ gcc test.c -o testsbc_7109_454_pdk3@aplex:~/test/c_program$ size testtext data bss dec hex filename1229 552 8 1789 6fd test 然后,我們在里面加一個局部變量,全局變量: ![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113549365-425031064.png) ![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113911240-769225067.png) 在看一下局部靜態變量: ![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817114334756-1509640442.png)
  • 棧和堆

在執行程序前,我們能看到的是上面的 非初始化數據段以及初始化數據段和正文段,在執行了程序后,我們還能看到棧和堆。 棧:自動變量以及每次函數調用時所需保存的信息都存放在此段中。每次調用函數時,其返回地址以及調用者的環境信息,都存放在棧中。然后,最近被調用的函數在棧上為其自動和臨時變量分配存儲空間。通過以這種方式使用棧,可以遞歸調用C函數,遞歸函數每次調用自身時,就使用一個新的棧幀,因此一個函數調用實例中的變量集不會影響另一個函數調用實例中的變量。局部變量也是存放在棧區。 堆:動態內存分配。堆處于非初始化數據段和棧之間。
  • 代碼 test.c:

#include <stdio.h> #include <stdlib.h> #include <string.h> void test(void) { printf("This is test function\n"); } int test1 = 100; int test2; int main(void) { int a; static int b = 100; static int c; char *test3; test3 = (char *)malloc(sizeof(char) * 10); int *pa = &a, *pb = &b, *pc = &c, *ptest1 = &test1, *ptest2 = &test2; printf("桟:pa = %p\n", pa); // 桟 stack printf("堆:test3 = %p\n", test3); // 堆 heap printf("bss: ptest2 = %p\n", ptest2); // 未初始化的數據區 printf("bss: pc = %p\n", pc); // 未初始化的數據區 bss printf("data: ptest1 = %p\n", ptest1); // 初始化的數據區 printf("data: pb = %p\n", pb); // 初始化的數據區 free(test3); return 0; } ![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817131823225-423244804.png)
  • 空間分配如下圖所示:

總結

以上是生活随笔為你收集整理的C 程序的存储空间记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。