linux 堆、栈、全局变量存放

在学习《深入理解计算机系统》中链接这一章中,数据讲一个可执行文件包含多个段。在Linux系统中代码段总是从0x08048000处开始,数据段在接下来的4KB对齐的地址处,运行时堆在接下来的读写段之后的第一个4KB对齐的地址处,并通过调用malloc库网上增长,开始于地址0x40000000处的段是为共享库保留的,用户栈总是从地址0xbfffffff处开始,并向下增长,从栈的上部开始于地址0xc0000000处的段是为操作系统驻留存储器部分的代码和数据保留的。如下图:


下面通过代码来测试:

#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,C一站式学习》笔记)