这是我的第一个StackOverflow问题,如果我搞砸了,我很抱歉。这里有一个小提示:我刚开始学习C(就像几天前,从w3schools)。今天,我正在实验C数组,并试图读取一个数组的值,该数组已声明但未赋值。我期望输出为0,但它是随机数。
下面是我的代码:
#include <stdio.h>
int main()
{
int test[10];
for (int i = 0; i < 10; i++)
{
printf("%i\n", test[i]);
}
return 0;
}
我声明了一个数组test
,但是没有给它赋值,当我读取它的值时,我希望找到0,但是下面是输出
0
0
-1787751399
32759
8
0
11
0
29823880
702
我试着搜索,但是我缺乏经验,什么也没找到。我确实看到了一些关于酒店房间和书的东西,但是我真的不明白。我真的很感激你的帮助,谢谢!
- 编辑:* 非常感谢所有回答这个问题的用户,非常感谢你们所有人。我也读了更多关于非预期行为和记忆持续时间的文章,就像答案所建议的那样。再次感谢你们所有人!
2条答案
按热度按时间qgelzfjb1#
C语言中的所有变量都有一个名为 storage duration 的东西,本质上意味着“这个变量是如何初始化的,我期望它能存活多久?”
static
的所有变量。除非由程序员显式初始化,否则这些变量保证在 * main()启动之前 * 被初始化为零/空指针。
这些变量将在整个程序执行过程中有效。
{
和}
之间的函数内声明的所有变量(以及函数参数)。除非程序员明确初始化,否则这些变量无法保证它们将包含什么值。它们具有所谓的“不确定值”,本质上是垃圾。使用这样的值可以给予任何结果,甚至每次使用不确定值时都可能得到不同的结果。
这些变量只有在到达声明它们的块中的
}
时才有效。malloc
系列函数。如果使用
malloc
,则分配的块包含不确定的值。如果使用calloc
,则分配的块被初始化为全零。这些变量将一直有效,直到您显式调用
free()
为止。(还有线程存储,但我不会在这里讨论。)
这些场景中的一些会导致未初始化的数据具有不确定的“垃圾”值,主要是性能原因。将某个值初始化为全零会占用执行时间。例如,
malloc
总是比calloc
快。guykilcj2#
这是一种未定义的行为,C标准没有说明如果你执行这样的代码会发生什么。任何事情都可能发生,编译器甚至可能丢弃整个代码块
附录J -未定义行为:
具有自动存储持续时间的对象的值在不确定时使用(6.2.4、6.7.9、6.8)。