在學習《深入理解計算機系統》中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中**段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共享庫保留的,使用者棧總是從位址0xbfffffff處開始,並向下增長,從棧的上部開始於位址0xc0000000處的段是為作業系統駐留儲存器部分的**和資料保留的。如下圖:
下面通過**來測試:
#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 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...