数组初始化的奇怪值

时间:2015-04-11 19:29:42

标签: c

我是C语言编程的新手,我找到了一些我不理解的东西:

初始化没有给定值的数组时,我认为所有元素都是零。我写了几行代码......

int main()                    
{     
    int obj[10][4];

    for (int a = 0; a < 10; a++)
    {
        print("%d\t%d\t%d\t%d\n", obj[a][0], obj[a][1], obj[a][2], obj[a][3]);
    }            
}

......并且对其输出感到非常困惑:

0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       7661
7960    2697    2260    7960
1551630361      -2130960380     146780176       -2130960380

我不明白为什么有些值是零,有些则不是。当我添加更多代码时,我更加困惑的是这个数字会发生变化。例如,我更改了上一个示例并添加了另一个print() ...

int main()                    
{     
    int obj[10][4];

    print("start\tstop\tcenter\tdist\n\n");

    for (int a = 0; a < 10; a++)
    {
        print("%d\t%d\t%d\t%d\n", obj[a][0], obj[a][1], obj[a][2], obj[a][3]);
    }            
}

......得到这个:

start   stop    center  dist

0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       0
0       0       0       7673
7972    2709    2272    7972
1551630361      -2130960380     146780176       -2130960380

使用更大的数组,这个数字不仅可以在最后找到。前几个值总是为零,但接着是#34;某些东西&#34;发生的情况。

我找到了一个使用memset()的解决方案here at SO,对我有用,但是......这里发生了什么?

有人可以用C-newbie理解的词来解释这个吗?

7 个答案:

答案 0 :(得分:4)

简单地说,你不能假设数组被初始化为0,除非你自己明确地进行了初始化。 C标准不保证阵列内容的任何内容,只是你已经为它分配了内存。
有关C general中初始化和数组的一个很好的参考资料可以在这里找到:http://www.tutorialspoint.com/cprogramming/c_multi_dimensional_arrays.htm

答案 1 :(得分:2)

您有一个变量声明但没有初始化。

如果你想让你的数组初始化为零,只需输入:

int obj[10][4] = {0};

答案 2 :(得分:1)

任何内容的初始值都是未定义的。您的代码只是定义了一个数组 - 它从不为其中的内容赋予任何值。

答案 3 :(得分:1)

int obj[10][4]的存储类类型为auto,它存储在堆栈中。 auto变量没有得到初始值,即它们有垃圾值。如果你想用零初始化数组,那么使它成为全局,即在main()函数之外声明数组。

答案 4 :(得分:0)

堆栈包含垃圾,直到程序将特定值放入堆栈中定义的变量。 启动代码不会初始化堆栈内容。

注意:全局空间/文件全局空间中的变量由启动代码初始化。如果没有指定特定的初始值设定项,则将内存设置为0x00。

答案 5 :(得分:0)

最初,该数组将具有一些垃圾值或任何不可预测的值。没有人知道这些值是什么,或者它们在阵列中的位置。

每当您在C中声明一个数组时,请在使用前对其进行初始化。即,运行循环以将所有数组位置初始化为零或您要存储的任何数字。这样您就可以确定数组包含的内容,并且在进一步处理中,您的数组将不会显示未定义的行为。

答案 6 :(得分:0)

不是专家,而是来自经验的假设:

如果将数组初始化为static int myArray[1000],则C会在程序持续时间内分配填充1000个零的新内存。使用int myArray[1000]初始化只会留出1000个寄存器,其中一些寄存器可能包含先前使用寄存器的旧值。