【发布时间】:2019-10-23 12:43:36
【问题描述】:
我在 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] 仍然有错误的值顺便说一句:
#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 个元素正确定义。
【问题讨论】:
-
你没有在任何代码 sn-p 中初始化
foo[4]。因此,打印foo[4]是 UB,您不能保证任何特定的结果。 -
@Blaze 是的,我知道。但是为什么它也会导致未定义的行为呢?我已经正确定义了数组。
-
除非您明确初始化局部变量(包括数组),否则它们的值和内容将是不确定的。在 C++ 中,即使读取不确定的值也是未定义的行为(不像 C,它只是可能,所以请选择你真正编程的语言)。
-
是的,您已经定义了一个数组,但您从未定义它的值。这意味着它有一个未定义的值。
-
是的,all 局部非静态变量也是如此。全局变量或局部静态变量将被初始化。
标签: c arrays undefined-behavior