未初始化适当的数组元素会导致未定义的行为
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
我在 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