linux项目变量存放,linux 堆、栈、全局变量存放
在學習《深入理解計算機系統》中鏈接這一章中,數據講一個可執行文件包含多個段。在Linux系統中代碼段總是從0x08048000處開始,數據段在接下來的4KB對齊的地址處,運行時堆在接下來的讀寫段之后的第一個4KB對齊的地址處,并通過調用malloc庫網上增長,開始于地址0x40000000處的段是為共享庫保留的,用戶棧總是從地址0xbfffffff處開始,并向下增長,從棧的上部開始于地址0xc0000000處的段是為操作系統駐留存儲器部分的代碼和數據保留的。如下圖:
下面通過代碼來測試:
#include
inta1=0;
staticintsa=0;
inta2=0;
intb;
intmain()
{
intc1=1;
intc2;
int*d=(int*)malloc(sizeof(int)*10);
int*e=(int*)malloc(sizeof(int)*10);
staticintf=0;
if(d==NULL)
{
printf("malloc?error");
return-1;
}
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);
return0;
}
#include
int a1=0;
static int sa=0;
int a2=0;
int b;
int main()
{
int c1=1;
int c2;
int *d=(int *)malloc(sizeof(int)*10);
int *e=(int *)malloc(sizeof(int)*10);
static int f=0;
if(d==NULL)
{
printf("malloc error");
return -1;
}
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 堆、栈、全局变量存放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win怎么从u盘启动不了 win系统U盘
- 下一篇: linux驱动 打印变量,linux驱动