【C】C程序在内存中的布局

** C程序在内存中的布局大致如下图所示 **


【C】C程序在内存中的布局_第1张图片
内存布局

从上到下依次是栈空间,堆空间,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;
}

如有问题欢迎批评指正,谢谢!

你可能感兴趣的:(【C】C程序在内存中的布局)