首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况:
-
全局变量:在所有函数外定义(包含主函数),所有函数均能调用.全局变量都是静态存储,没初始化时默认为0;
-
局部变量:函数内部定义,只适用于当前函数.没初始化时,若是静态存储,则为0,若是动态存储,则为随机值.(并不是真正的随机)
定义局部变量,其实就是在栈中通过移动栈指针,来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的) ,所以说使用栈来实现的局部变量定义时如果不初始化,里面的值就是一个垃圾值。由此我们扩展一下,其实不仅仅是局部变量,所有的变量在定义时只是在内存中分配一块空间,并没有对这块空间进行任何的初始化。如果这块内存以前被用过,里面的数据还在,那它对于我们来说是没有任何意义的垃圾值。而且有时候这些数据会对我们的编程造成错误。所以我们一定要初始化变量,也就是用新的、有用的数据覆盖掉以前的数据。可能你会有个问题,那些以前用过的内存经过操作系统回收后,为什么里面还有数据。其实操作系统仅仅是回收这些内存,告诉其他程序可以用了,但并不删除这些内存里面的数据。
至于为什么不删除这些内存里面的数据?
至于为什么不删除这些内存里面的数据?
简单来说,原因是效率。全局和静态变量是在编译期就确定了地址和值,并不消耗运行时的时间。动态变量是在每次函数调用时才在栈上产生,你可以自行选择是否初始化。
深一点讲:不同的内存区域在程序运行时特性是不同,大致分为静态空间、栈空间、堆空间。静态空间其实是跟着程序映像一起加载到内存里的,提前就写在映像里了,无论如何会有个初始值,反正写啥都是写,不如写0;而栈空间和堆空间是映像加载完之后系统分配的,为了提高效率系统不会主动替你清零,C也不会,所以未初始化的变量是内存里原有的值。(所谓映像就是可执行程序的文件)
深一点讲:不同的内存区域在程序运行时特性是不同,大致分为静态空间、栈空间、堆空间。静态空间其实是跟着程序映像一起加载到内存里的,提前就写在映像里了,无论如何会有个初始值,反正写啥都是写,不如写0;而栈空间和堆空间是映像加载完之后系统分配的,为了提高效率系统不会主动替你清零,C也不会,所以未初始化的变量是内存里原有的值。(所谓映像就是可执行程序的文件)