未初始化适当的数组元素会导致未定义的行为

Non-initialisation of proper array element causes undefined behavior

我在 VSC 中做了一些测试来检查数组的行为。我在一个测试的输出中遇到了这个问题,尽管数组元素定义正确,但显然发生了未定义的行为,但只是没有初始化(正确的我的意思是数组元素是用数组本身定义的,而不是额外地超过导致众所周知的未定义行为的数组边界)。

这是我的代码,下面是它的输出:

问题是关于 foo[4] 的输出,它是 8 而不是 0。

#include <stdio.h> 

int main()
{
    int foo[12];
    int i;

    foo[5] = 6; 
    foo[6] = 7;
    foo[7] = 8;
    foo[8] = 9;
    foo[9] = 10;
    foo[10] = 11;
    foo[11] = 12;

    for(i=0 ; i<=11 ; i++)
    {
        printf("foo[%d] = %d\n",i,foo[i]);
    }
}

输出:

foo[0] = 0
foo[1] = 0
foo[2] = 0
foo[3] = 0
foo[4] = 8
foo[5] = 6
foo[6] = 7
foo[7] = 8
foo[8] = 9
foo[9] = 10
foo[10] = 11
foo[11] = 12

此后我尝试了其他方法,想看看 foo[5] 是否也受到影响,如果我不初始化它,但事实并非如此。 foo[4] 仍然有错误的值 btw:

#include <stdio.h> 

int main()
{
    int foo[12];
    int i;

    // foo[5] = 6; 
    foo[6] = 7;
    foo[7] = 8;
    foo[8] = 9;
    foo[9] = 10;
    foo[10] = 11;
    foo[11] = 12;

    for(i=0 ; i<=11 ; i++)
    {
        printf("foo[%d] = %d\n",i,foo[i]);
    }
}

输出:

foo[0] = 0
foo[1] = 0
foo[2] = 0
foo[3] = 0
foo[4] = 8
foo[5] = 0
foo[6] = 7
foo[7] = 8
foo[8] = 9
foo[9] = 10
foo[10] = 11
foo[11] = 12

我的问题是:为什么 foo[4] 会出现未定义的行为?数组定义正确,有 12 个元素。

Why is happening here undefined behavior at foo[4]? The array is defined proper with 12 elements

一言以蔽之

也就是当你如下定义局部数组时。

int foo[12];

foo 的每个元素在显式初始化之前都将具有不确定的值。

The issue is about the output of foo[4].

不仅如此。

问题出在数组的每个 未初始化 元素上,您稍后会访问这些元素 - 这些元素具有 indeterminate(垃圾)值。

您没有初始化数组的前 5 个元素,但您在调用 Undefined Behavior (UB) 的 for 循环中访问它们。

你只是(不)幸运,你的数组的前四个元素恰好在今天,在你的机器上,此时,被初始化为你希望它们成为的值。

这是我通过 运行 你的代码 online:

得到的输出
foo[0] = 0
foo[1] = 0
foo[2] = 4195741
foo[3] = 0
foo[4] = 0
foo[5] = 6
foo[6] = 7
foo[7] = 8
foo[8] = 9
foo[9] = 10
foo[10] = 11
foo[11] = 12