在学习《深入理解计算机系统》中链接这一章中,数据讲一个可执行文件包含多个段。在Linux系统中代码段总是从0x08048000处开始,数据段在接下来的4KB对齐的地址处,运行时堆在接下来的读写段之后的第一个4KB对齐的地址处,并通过调用malloc库网上增长,开始于地址0x40000000处的段是为共享库保留的,用户栈总是从地址0xbfffffff处开始,并向下增长,从栈的上部开始于地址0xc0000000处的段是为操作系统驻留存储器部分的代码和数据保留的。如下图:
下面通过代码来测试:
#include<stdio.h>
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程序中,全局变量和静态变量存储在读写段,常量存储在制度段,动态申请的内容是在堆上,局部变量在运行时栈中。