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

标签 c arrays 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 个元素。

最佳答案

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

不仅如此。

问题在于数组中每个未初始化 元素,您稍后会访问这些元素 - 这些元素具有不确定(垃圾)值。

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

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

这是我通过运行您的代码得到的输出 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

关于c - 未初始化适当的数组元素会导致未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58523146/

相关文章:

c - 在 GDB 中显示结构值

javascript数组参数列表

java - 如何显示数组元素?

c - 如何在 int safecpy(char **t, char *s) 中使用双指针和 printf?

c - C中链表插入函数问题

c - 双核 ARMv7 处理器中的并行处理

c - 从 double 到 float 的转换是否总是潜在地调用未定义的行为?

关于 C 中的短数据类型格式说明符的困惑

c - 一种不使用 'C' 的语言?

rust - 在没有未定义行为的情况下,如何在 Rust 中的对等点之间共享不安全状态?