编码:
#include <stdio.h>
int main(void) {
int arr[10];
arr[0] = 1;
arr[1] = 2;
for (int i = 0; i < 10; ++i) {
printf("arr[%d] = %d;\n", i, arr[i]);
}
return 0;
}
结论:
arr[0] = 1;
arr[1] = 2;
arr[2] = 0;
arr[3] = 0;
arr[4] = 4195632;
arr[5] = 0;
arr[6] = 4195344;
arr[7] = 0;
arr[8] = -669909312;
arr[9] = 32765;
是什么决定了屏幕上显示的值?
您已
main
在功能块中创建了一个具有自动存储持续时间的本地数组。这样的数组没有被隐式初始化,并且它们的元素具有未定义的值,这就是您的程序输出所展示的。
根据 C 标准(6.7.9 初始化)
您可以在声明数组时将其初始化为零
或者您可以立即用数字 1 初始化数组的第一个元素,用 2 初始化第二个元素,其余的用零初始化。
或者您可以声明一个具有静态内存持续时间的数组。在这种情况下,编译器会将其隐式初始化为零。例如
或者
这个问题与数组及其工作方式无关。在这种情况下,“条件”一词是不适用的。这些值不是有条件的。
您正在访问未初始化的对象。这些对象是数组元素的事实没有任何作用。未初始化的对象包含不确定的值,在 C 中可以是未指定的值,也可以是陷阱表示。
万一你偶然发现了一个被禁止的视图,你的程序将有未定义的行为。(
int
您平台上的类型很可能没有非法表示。)在未指定值的情况下,语言不保证该值是稳定的,即 对同一个未初始化对象的重复调用可能会在其中看到不同的值。
换句话说,这些值根本不是“有条件的”:无论是在最初声明对象时,还是在随后调用对象时随时间推移。