我是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理解的词来解释这个吗?
您有变量声明但没有初始化。
如果你想让你的数组初始化为零,只需将其放入:
int obj[10][4] = {0};
简单地说,你不能假设数组被初始化为0,除非你自己明确地进行了初始化。 C标准不保证数组内容的任何内容,只是你将为它分配内存。 关于C general中初始化和数组的一个很好的参考资料可以在这里找到:http://www.tutorialspoint.com/cprogramming/c_multi_dimensional_arrays.htm
任何东西的初始值都是未定义的。您的代码只定义了一个数组 - 它从不为其中的内容赋予任何值。
存储类类型的int obj[10][4]
是auto
,它存储在堆栈中。 auto
变量没有得到初始值,即它们有垃圾值。如果你想用零初始化数组,那么使它全局,即在main()
函数之外声明数组。
堆栈包含垃圾,直到程序将特定值放入堆栈中定义的变量。启动代码不会初始化堆栈内容。
注意:全局空间/文件全局空间中的变量由启动代码初始化。如果没有指定特定的初始值设定项,则将内存设置为0x00。
最初,该数组将具有一些垃圾值或任何不可预测的值。没有人知道这些值将是什么,或者它们在阵列中的位置。
每当您在C中声明一个数组时,请在使用之前对其进行初始化。即,运行循环以将所有数组位置初始化为零或您要存储的任何数字。这样您就可以确定数组包含的内容,并且在进一步处理中,您的数组不会显示未定义的行为。
不是专家,而是来自经验的假设:
如果将数组初始化为static int myArray[1000]
,则C在程序的持续时间内分配填充1000个零的新内存。使用int myArray[1000]
初始化只需要放置1000个寄存器,其中一些寄存器可能包含先前使用寄存器的旧值。