** C程序在内存中的布局大致如下图所示 **
内存布局
从上到下依次是栈空间,堆空间,bbs段,data段,文本段
栈(stack)
1,地址空间由高向低减少,先分配高地址。
2,由编译器自动分配释放,主要存放函数参数,局部变量的值。
3,C语言函数参数进栈的顺序是从右向左(主要是为了支持可变长参数形式)。
堆(head)
1,主要用于动态分配内存,malloc等函数,由free释放。
静态存储区包括bbs段和data段
bbs(bbs)
1,存放一些未初始化的全局变量。
data(data)
1,存放一些已经初始化的全局变量,静态变量和常量。
text(text)
1,存放程序执行代码的区域,区域大小在运行的时候就已经确定了。
2,内存区域只读的,也可能包含一些只读的常数变量,字符串常量等。
一个非常清晰的程序图
//main.c
int a = 0;//全局初始化区
char *p1;//全局未初始化区
int main()
{
static int c = 0;//全局(静态)初始化区
int b;//栈区
char s1[] = "abc";//"abc\0"在常量区,s1栈区
char s2[] = "abc";//"abc\0"在常量区,s2栈区
//s1和s2是不想等的
char *p2;//栈区
char *p3 = "123456";//"123456\0"在常量区,p3在栈区
char *p4 = "123456";//"123456\0"在常量区,p4在栈区
//p3和p4是一样的,都只想同一个位置"123456\0"所在位置
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来的10和20字节的区域在堆区
return 0;
}
如有问题欢迎批评指正,谢谢!