循环中声明的数组在循环重复时是否设置为零?
我有一个数组并以这种方式使用它..
while(i<n)
{
int a[1000];
//taking inputs in array..
/*some calculations with array..
the values in array may change*/
}
下一次循环重复时,再次声明数组a,它是一个新数组,所以现在不是数组零的值吗?
实际上我有一个这样的代码,并观察到值不是零,而是与循环重复之前的相同。为什么呢?
答案 0 :(得分:3)
数组的值未初始化,它们包含堆栈中的“random” junk 值。
在每次循环运行中,数组中的数字也可能会被覆盖。即如果你需要在循环之间保持不变的值,那么在while
循环之前提升数组声明。
使用
int a[1000] = {0};
用零初始化数组。
答案 1 :(得分:3)
即使首次使用,本地数组也不会自动归零。
您需要明确地执行此操作:
while(i<n)
{
int a[1000] = {0};
// :
}
答案 2 :(得分:1)
原则上,每次都应将其视为新阵列。在实践中,它可能具有与前一次迭代中相同的值。如果你想在每次循环时想要一个全新的数组,你需要使用malloc
或calloc
来分配它 1 (然后free
at循环的底部,以避免内存泄漏)。
考虑这个测试:
#include <stdio.h>
int main()
{
int i = 0, n = 10;
while(i++<n)
{
int a[10];
printf("before assignment: %d\n", a[2]);
a[2] = 5;
}
return 0;
}
在第一次迭代中,a[2]
可以包含任何内容。实际上,在初始化之前读取值是未定义的行为。这当然是值得避免的,因为它可能导致不可预测的后果。
在第二次迭代(以及后续的迭代)中,当我测试它时碰巧包含5(但是它没有保证它应该)。
但是,如果您按照以下方式初始化a
:
int a[10] = {0};
然后a
的所有元素每次都为0。
1。实际上,如果你这样做的话,你最终可能会得到相同的内存块。任何一种方式都不能依赖这种行为。