我是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理解的词来解释这个吗?
答案 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个寄存器,其中一些寄存器可能包含先前使用寄存器的旧值。