在。。之间
int array[100][100];
和
int array[100][100]={0};
在第一个中,当我打印数组的所有元素时,在第 94 行之后,中途,我开始获取垃圾值,但之前的所有值都是 0,而对于第二个,所有值都是 0 .
第一个声明不是用默认的 0 值初始化吗?如果不是,为什么不是数组中的所有值都是垃圾,为什么只有在第 94 行之后才会出现垃圾值?
在。。之间
int array[100][100];
和
int array[100][100]={0};
在第一个中,当我打印数组的所有元素时,在第 94 行之后,中途,我开始获取垃圾值,但之前的所有值都是 0,而对于第二个,所有值都是 0 .
第一个声明不是用默认的 0 值初始化吗?如果不是,为什么不是数组中的所有值都是垃圾,为什么只有在第 94 行之后才会出现垃圾值?
第一个声明不是用默认的 0 值初始化吗?
不。假设这是一个局部范围的变量,您的第一个声明根本不会导致任何初始化。
为什么不是数组中的所有值都是垃圾,为什么只有在第 94 行之后才会出现垃圾值?
未初始化的内存可以有任何值,包括0
您正在观察的值。
只有当变量是全局变量时,第一种样式才会导致数据初始化为 0。缺少显式初始化的局部变量将等于将空间分配给变量时发生在其存储位置中的任何内容。
第一个声明不保证任何初始化,事实上我不认为它执行任何。
直到第 94 个元素您才拥有清晰的内存,这是因为操作系统为您提供了一些干净/未使用的内存。
如果你想确保有清晰的记忆,你必须使用第二个声明
第一条语句中没有显式初始化。如果数组在全局范围内声明,则可以进行隐式初始化。
“似乎已初始化一半”的原因是用户空间程序出于安全原因通常从零堆栈/堆开始(不访问包含密码等的其他进程的数据),但不能保证始终清除局部变量. 有一个保证,不是因为性能原因。即使在 C 中,在调用 main 之前也可能发生很多活动:crt0 初始化运行时,将静态数据从 read_only 部分复制到全局变量等。结果是许多程序堆和堆栈不再完整。
整数数组[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
初始化为零。
整数数组[100][100]={0};
Irrespective of any segments [Stack/Data(Global,Static)] if any one
变量在数组中初始化,然后其余的数组元素将初始化为零。
首先,+1 是针对简洁直接的问题。现在回答,局部变量如果没有显式初始化,也不会隐式初始化。包含 0 而不是其他垃圾值的所有 93 个成员都不是定义的行为。您可以尝试多次执行上述代码,您将看到第一次声明返回不同的垃圾值。为了更好地理解,请进入上述代码的汇编级别,亲眼看看内部发生了什么。