未初始化的数组的值都是随机的?不!

首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况:
  1. 全局变量:在所有函数外定义(包含主函数),所有函数均能调用.全局变量都是静态存储,没初始化时默认为0;

  2. 局部变量:函数内部定义,只适用于当前函数.没初始化时,若是静态存储,则为0,若是动态存储,则为随机值.(并不是真正的随机)

定义动态局部变量时如果未初始化,则值是随机的。为什么?
 
定义局部变量,其实就是在栈中通过移动栈指针,来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的) ,所以说使用栈来实现的局部变量定义时如果不初始化,里面的值就是一个垃圾值。由此我们扩展一下,其实不仅仅是局部变量,所有的变量在定义时只是在内存中分配一块空间,并没有对这块空间进行任何的初始化。如果这块内存以前被用过,里面的数据还在,那它对于我们来说是没有任何意义的垃圾值。而且有时候这些数据会对我们的编程造成错误。所以我们一定要初始化变量,也就是用新的、有用的数据覆盖掉以前的数据。可能你会有个问题,那些以前用过的内存经过操作系统回收后,为什么里面还有数据。其实操作系统仅仅是回收这些内存,告诉其他程序可以用了,但并不删除这些内存里面的数据。

至于为什么不删除这些内存里面的数据? 
简单来说,原因是效率。全局和静态变量是在编译期就确定了地址和值,并不消耗运行时的时间。动态变量是在每次函数调用时才在栈上产生,你可以自行选择是否初始化。
深一点讲:
不同的内存区域在程序运行时特性是不同,大致分为静态空间、栈空间、堆空间。静态空间其实是跟着程序映像一起加载到内存里的,提前就写在映像里了,无论如何会有个初始值,反正写啥都是写,不如写0;而栈空间和堆空间是映像加载完之后系统分配的,为了提高效率系统不会主动替你清零,C也不会,所以未初始化的变量是内存里原有的值。(所谓映像就是可执行程序的文件)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值