一个C语言程序内存空间主要由5个部分组成,由地地址到高地址分别为:代码段、数据段、BSS段、堆区、栈区。其中,栈区和堆区是在程序运行时分配空间的,而代码段、BSS段、数据段则是在程序编译时分配空间的。 结构图如下图C语言内存管理_空间

在C程序中,区分内存所属区域总结如下。

    代码段(code segment):主要存放一些指令、函数。

    数据段:已经初始化的全局变量、静态变量、只读变量。在C代码中,一些只读的数据变量,如字符常量也是存放在数据段中;如下例C语言内存管理_空间_02

    BSS段:未初始化的全局变量、静态变量、只读变量。BSS段上的数据,用户在定义时未初始化,系统会自动初始化为0(对于整数等),而字符串初始化为NULL。(和数据段的数据对比可知……)

     堆:利用系统函数(malloc、realloc、calloc )分配空间,同时这些空间还需要手动释放(free),不然会发生内存泄露。 堆上的存储空间没有名字,需要通过一个指针变量的指向以访问。

    栈:局部变量(除去静态、只读)、函数形参、函数返回值。栈上的变量,如果定义时未初始化,系统不会自动初始化为0,跟BSS段不同。栈上的变量离开了作用域,存储的空间就会被系统释放,所以函数的函数值不能是局部变量的地址。

    下面一个C程序中变量内存所属的例子。

C语言内存管理_程序_03