在C中循环重新声明数组

时间:2014-07-29 17:05:39

标签: c arrays

循环中声明的数组在循环重复时是否设置为零?

我有一个数组并以这种方式使用它..

while(i<n)
{
    int a[1000];
    //taking inputs in array..
    /*some calculations with array..
    the values in array may change*/
}

下一次循环重复时,再次声明数组a,它是一个新数组,所以现在不是数组零的值吗?

实际上我有一个这样的代码,并观察到值不是零,而是与循环重复之前的相同。为什么呢?

3 个答案:

答案 0 :(得分:3)

数组的值未初始化,它们包含堆栈中的“random” junk 值。

在每次循环运行中,数组中的数字也可能会被覆盖。即如果你需要在循环之间保持不变的值,那么在while循环之前提升数组声明。

使用

int a[1000] = {0};

用零初始化数组。

答案 1 :(得分:3)

即使首次使用,本地数组也不会自动归零。

您需要明确地执行此操作:

while(i<n)
{
    int a[1000] = {0};
    // :
}

答案 2 :(得分:1)

原则上,每次都应将其视为新阵列。在实践中,它可能具有与前一次迭代中相同的值。如果你想在每次循环时想要一个全新的数组,你需要使用malloccalloc来分配它 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。实际上,如果你这样做的话,你最终可能会得到相同的内存块。任何一种方式都不能依赖这种行为。