未赋值的C数组是怎么回事?

koaltpgm  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(155)

这是我的第一个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

我试着搜索,但是我缺乏经验,什么也没找到。我确实看到了一些关于酒店房间和书的东西,但是我真的不明白。我真的很感激你的帮助,谢谢!

  • 编辑:* 非常感谢所有回答这个问题的用户,非常感谢你们所有人。我也读了更多关于非预期行为和记忆持续时间的文章,就像答案所建议的那样。再次感谢你们所有人!
qgelzfjb

qgelzfjb1#

C语言中的所有变量都有一个名为 storage duration 的东西,本质上意味着“这个变量是如何初始化的,我期望它能存活多久?”

    • 静态储存时间 *:在任何函数之外声明的所有变量(在 file scope 处)以及声明为static的所有变量。

除非由程序员显式初始化,否则这些变量保证在 * main()启动之前 * 被初始化为零/空指针。
这些变量将在整个程序执行过程中有效。

    • 自动存储时间 *:在{}之间的函数内声明的所有变量(以及函数参数)。

除非程序员明确初始化,否则这些变量无法保证它们将包含什么值。它们具有所谓的“不确定值”,本质上是垃圾。使用这样的值可以给予任何结果,甚至每次使用不确定值时都可能得到不同的结果。
这些变量只有在到达声明它们的块中的}时才有效。

    • 分配的储存时间 *:所有变量都显式分配了malloc系列函数。

如果使用malloc,则分配的块包含不确定的值。如果使用calloc,则分配的块被初始化为全零。
这些变量将一直有效,直到您显式调用free()为止。
(还有线程存储,但我不会在这里讨论。)
这些场景中的一些会导致未初始化的数据具有不确定的“垃圾”值,主要是性能原因。将某个值初始化为全零会占用执行时间。例如,malloc总是比calloc快。

guykilcj

guykilcj2#

这是一种未定义的行为,C标准没有说明如果你执行这样的代码会发生什么。任何事情都可能发生,编译器甚至可能丢弃整个代码块
附录J -未定义行为:
具有自动存储持续时间的对象的值在不确定时使用(6.2.4、6.7.9、6.8)。

相关问题