为什么arr [3]与arr [SOME_CONST]的行为不同,其中SOME_CONST = 3?

fou*_*_29 0 c

我很难理解为什么为什么初始化一个具有文字大小的数组(例如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上创建了两个片段,以演示这种行为。

预期

意外

Ame*_*aVS 5

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