转自:http://blog.csdn.net/kkxgx/article/details/7520902
在学习《深入理解计算机系统》中链接这一章中,数据讲一个可执行文件包含多个段。在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程序中,全局变量和静态变量存储在读写段,常量存储在只读段,动态申请的内容是在堆上,局部变量在运行时栈中。