我很难理解为什么为什么初始化一个具有文字大小的数组(例如int arr[3];
)会产生与初始化为常量大小(如int arr[SOME_CONST];
设置为3)的数组不同的行为。
当将数组的大小作为文字提供时,其行为与预期的一样:
int arr[3];
//initialize the first two elements of the array, leave the third element uninitialized.
arr[0] = 1;
arr[1] = 2;
//print all elements of array
printf("arr[0]: %d\n", arr[0]);
printf("arr[1]: %d\n", arr[1]);
printf("arr[2]: %d\n", arr[2]);
Run Code Online (Sandbox Code Playgroud)
输出:
arr[0]: 1
arr[1]: 2
arr[2]: 0
Run Code Online (Sandbox Code Playgroud)
正如你可以在输出中看到未初始化的元素的值arr[2]
是0
一样的预期。
当数组大小定义为常量时,行为变得异常,如下所示:
arr[0]: 1
arr[1]: 2
arr[2]: 0
Run Code Online (Sandbox Code Playgroud)
输出:
arr[0]: 1
arr[1]: 2
arr[2]: 32766
Run Code Online (Sandbox Code Playgroud)
现在,未初始化的元素arr[2]
的看似随机值为32766
有人可以帮我理解为什么这两种情况表现不同。
我在ideone上创建了两个片段,以演示这种行为。
C标准不保证局部变量的初始化。
关于初始化语句:
arr[0] = 1;
arr[1] = 2;
Run Code Online (Sandbox Code Playgroud)
编译器可以很好地将它们优化为以下语句:
int arr[3] = {1, 2, 0};
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,我将不依赖于一个编译器的行为。最好在初始化语句中明确指出。
您可以在这里进行类似的讨论。
同样在第二种情况下,您尝试使用可变长度数组:https : //en.wikipedia.org/wiki/Variable-length_array
这是您正在使用的GCC编译器提供的扩展,我不建议您在项目中使用它们。
数组的长度是在运行时计算的,可能在堆栈上分配(取决于编译器的实现)。
因此,它没有在代码中显式初始化。
您可以在此处查看生成代码的示例:https : //godbolt.org/z/J_JEVe