数组初始化的奇怪值

问题描述 投票:2回答:7

我是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

使用更大的数组,这个数字不仅可以在最后找到。前几个值总是为零,但随后会发生“某事”。

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

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

c
7个回答
2
投票

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

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

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

4
投票

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


1
投票

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


1
投票

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


0
投票

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

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


0
投票

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.