linux 堆 棧 全域性變數存放

2021-06-16 21:33:33 字數 1855 閱讀 5753

在學習《深入理解計算機系統》中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中**段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共享庫保留的,使用者棧總是從位址0xbfffffff處開始,並向下增長,從棧的上部開始於位址0xc0000000處的段是為作業系統駐留儲存器部分的**和資料保留的。如下圖:

下面通過**來測試:

[cpp]

view plain

copy

print

?

#include

int a1=0;  

static

int sa=0;  

int a2=0;  

int b;  

int main()  

printf("a1:%p\n",&a1);  

printf("sa:%p\n",&sa);  

printf("a2:%p\n",&a2);  

printf("b:%p\n",&b);  

printf("c1:%p\n",&c1);  

printf("c2:%p\n",&c2);  

printf("d:%p\n",&d);  

printf("*d:%p\n",d);  

printf("e:%p\n",&e);  

printf("*e:%p\n",e);  

printf("f:%p\n",&f);  

printf("%p\n",&"123");  

free(d);  

return 0;  

}  

#includeint a1=0;

static int sa=0;

int a2=0;

int b;

int main()

printf("a1:%p\n",&a1);

printf("sa:%p\n",&sa);

printf("a2:%p\n",&a2);

printf("b:%p\n",&b);

printf("c1:%p\n",&c1);

printf("c2:%p\n",&c2);

printf("d:%p\n",&d);

printf("*d:%p\n",d);

printf("e:%p\n",&e);

printf("*e:%p\n",e);

printf("f:%p\n",&f);

printf("%p\n",&"123");

free(d);

return 0;

}

執行結果如下:

分析如下:

a1,a2,sa,f是按序存放,且全域性共有非靜態變數和靜態變數是分開存放的,緊接著存放的是全域性非初始化變數b,由於是int型,故位址相差4.

c1,c2,d,e這幾個變數儲存在使用者棧空間。主要區分d、e和d、e申請記憶體之間的區別。

*d,*e 代表申請的記憶體,位址是增大方向,即位址是向上增長的,為堆中申請的資料。

「123」為常量,位址0x80486da應該在唯讀段的範圍內,屬於rodate資料。

故可知:c程式中,全域性變數和靜態變數儲存在讀寫段,常量儲存在制度段,動態申請的內容是在堆上,區域性變數在執行時棧中。

linux 堆 棧 全域性變數存放

在學習 深入理解計算機系統 中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中 段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共...

堆 棧 全域性變數的分配位址

二 c語言程式裡全域性變數 區域性變數 堆 棧等概念,在keil中針對stm32系統進行程式設計,除錯變數,進行驗證 通過串列埠輸出資訊到上位機,進行驗證。include include int k1 1 int k2 static int k3 2 static int k4 intmain 棧區...

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...