C语言变量内存分布

来源:互联网 发布:兰州知行学院官网 编辑:程序博客网 时间:2024/05/16 07:22

1.   首先,看一下内存中的分区情况:

①堆区 : 一般由程序员手动分配释放 , 若程序员不释放,程序结束时将由OS回收。

②栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
③全局区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。  程序结束后由系统释放 
④常量区:常量字符串就是放在这里的。 程序结束后由系统释放

 ⑤代码区:存放函数体的二进制代码。

 

2.   全局变量和栈变量

所谓全局变量就是不在任何函数体内(包括main函数)定义的变量,该变量会被分配一个全局区中的内存空间,一个全局变量会被自动初始化(如果没有赋初值的话)。自动初始化的效果就是将分配的内存中的每一个位都置为0,所以当变量类型为数值型时值为0,为字符型时是“空字符”,指针类型时是NULL。

栈变量是直接以定义的方式在函数体内(包括main函数)分配内存空间的变量。例如:void  f(){int  a;}

此时a的内存被分配在栈上,在栈上的内存不会被自动初始化。也就是说,如果再使用前没有对该变量赋初值,它将是一个随机的值(操作系统上次使用遗留下来的值)。

3.   堆内存

在C语言中,堆内存可以通过malloc函数来获取,该函数返回一个void*类型指针。该指针可以强制转换为其它任何指针,其分配的内存将不进行初始化。

4. 下面综合例子来看一下编译器和运行时如何为我们的程序分配内存。

情况一:


则该ch和s变量将被分配到内存全局区,并且被分配的内存将全部初始化为二进制的0。即ch为空字符,s为0。

情况二:


此时内存分配情况如下图示:


数组形式的内容常量是保存在栈区的,而指针形式内容的常量是保存在常量区的。注意cArray和array之间的区别。

上面所述的“计算区域”的含义是:在栈区中没有保存看上去似乎存在的“指针”,而是通过某种规则计算而得到的地址。也就是说,数组名可以转换为指针,但是它本身并不是指针。例如:对一个数组名做++操作,该操作将报错!

对各个变量输出地址如下:


上图也从侧面印证了上面的内存分布图。

情况三:


此时内存分配情况如下所示:


对于这种多维malloc的情况,需要“由内而外”地释放已分配的内存。如下:


到此,基本的情况就展示完了。站在内存的角度看程序是否别有一番风味(*^-^*)


0 0
原创粉丝点击