繁体   English   中英

C中两个不同数组初始化之间的区别

[英]Difference between two different array initialisation in C

在。。之间

int array[100][100];

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

在第一个中,当我打印数组的所有元素时,然后在第94行的中途,我开始获取垃圾值,但之前的所有值均为0,而对于第二个,所有值均为0 。

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

第一个声明不是也使用默认的0值初始化吗?

否。假设这是一个局部范围的变量,则第一个声明根本不会导致任何初始化。

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

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

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

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

在第94个元素之前,您拥有清晰的内存是因为操作系统为您提供了一些干净 / 尚未使用的内存。

如果要确保内存清晰则必须使用第二个声明

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

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

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 

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

首先,对简单明了的问题+1。 现在回答, 如果未显式初始化局部变量,则不会隐式初始化。 包含0且没有其他垃圾值的所有93个成员都不是已定义的行为。 您可以尝试多次执行上面的代码来尝试该操作,并且会看到不同的垃圾值返回给第一个声明。 为了更好地理解,请进入以上代码的汇编级别,并亲自了解内部发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM