C中两个不同阵列初始化的区别

时间:2013-03-20 11:10:19

标签: c arrays initialization

之间的

int array[100][100];

并且

int array[100][100]={0};

在第一个中,当我打印数组的所有元素然后在第94行之后,在它的中途,我开始得到垃圾值但是之前的所有值都是0,而对于第二个,所有的值为0.

第一个声明是否也使用默认的0值进行初始化,如果没有,那么数组中的所有值都不是垃圾,为什么只有在第94行之后才会出现垃圾值?

6 个答案:

答案 0 :(得分:1)

  

第一个声明是否也使用默认的0值进行初始化?

没有。假设这是一个本地范围的变量,你的第一个声明根本不会导致任何初始化。

  

为什么数组中的所有值都不是垃圾,为什么只有在第94行之后才出现垃圾值?

未初始化的内存可以包含任何值,包括您正在观察的0的值。

答案 1 :(得分:1)

第一种样式只有在变量是全局变量时才会将数据初始化为0。缺少显式初始化的局部变量将等于将空间分配给变量时发生在其存储位置的任何内容。

答案 2 :(得分:1)

第一个声明不保证任何初始化,实际上我认为它不会执行任何初始化。

直到第94个元素才有明确的内存,因为操作系统为你提供了一些 clean / 尚未使用的内存。

如果您想确保清除记忆,必须使用第二个声明

答案 3 :(得分:1)

第一个语句中没有明确的初始化。如果在全局范围内声明数组,则可以进行隐式初始化。

“似乎是半初始化”的原因是,出于安全原因(不访问包含密码等的其他进程的数据),用户空间程序通常以零堆栈/堆启动,但不能保证局部变量总是被清除。由于性能原因,这不是保证。即使在C中,在调用main之前也会发生很多活动:crt0初始化运行时,将read_only节中的静态数据复制到全局变量等。结果是很多程序堆和堆栈不再完整。

答案 4 :(得分:1)

int array [100] [100];

  if this declaration is in the scope of main i.e in Stack Segment then
该数组的记忆将在堆栈中单独发布。考虑是否有人使用过它 堆栈你可能得到零值,否则它会垃圾,它不是 特别是第94行元素。

 if same declaration is in Global, then all the array elements will be

坚持归零。

int array [100] [100] = {0};

 Irrespective of any segments [Stack/Data(Global,Static)] if any one 

变量在数组中初始化,然后其余的数组元素将 被初始化为零。

答案 5 :(得分:0)

首先是干净利落的问题+1。现在回答,局部变量如果没有显式初始化,则不会隐式初始化。包含0而不是其他一些垃圾值的所有93个成员都不是已定义的行为。你可以尝试多次执行上面的代码,你会看到不同的垃圾值返回第一个声明。为了更好地理解,进入上面代码的汇编级别,看看自己是什么在内部发生。