为什么这个代码被认为是一个 VLA,即使它使用了一个 int?

Why is this code considered a VLA even though it uses an int?

我以为我理解了 VLA 是什么,直到我在这里看到一个关于动态内存分配与可变长度数组之间的区别的问题。所以我对动态内存分配没有任何问题,至少现在是这样,但我不明白的是为什么这段代码被认为是 VLA:

int size = 10; // or whatever
int my_array [size] ; // why this is a VLA

更神秘的是,这竟然是一架VLA

const int size = 10;
int my_array [size];  // why even when i use a const it is a VLA .

所以,我的问题是,这两种不同的方法如何被视为 VLA?

据我所知,VLA 只是一个数组,其大小仅在运行时才知道,就像我提示用户输入数组的大小并将数组设置为此大小,以便编译器永远不会知道数组的大小。

但是,在上面的两段代码中,size 在编译时是已知的,所以如果这是真的,那么这些是 VLA,是标准的数组语法,必须像那样,没有别的。

int my_array[10];

我的另一个问题是,我听说const int size =10;实际上不是一个const,这意味着编译器不知道这个大小是否为10,它把它当作一个变量。

所以,如果有人能弄清楚 C++ 中变量和 const 之间的区别,我们将不胜感激。

注意:这是 Whosebug 问题的 link。所以,如果这个问题有什么不对的地方,有人可以纠正。

What's the difference between a VLA and dynamic memory allocation via malloc?

首先,C++中不存在变长数组。 C++ 中没有变长数组。此答案仅适用于特定的 GNU 编译器扩展以支持 C++ 中的可变长度数组。

why this is even a VLA size is still known to the compiler

问题不是关于 "what is known to the compiler",问题是关于定义。定义了术语和语言,并定义了什么是 VLA,什么不是。可变长度数组定义为大小不是 整数常量表达式 - int vla[<not integer constant expresion>]; 的数组。来自 C99 6.7.5.2p4:

If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.

什么是什么不是整数常量表达式又一次有一个非常确定的定义。

在 C 中,对于 int size = 10;const int size = 10; 这两个定义,作为表达式的 size 不是 integer constant expression。因此,您显示的两个数组定义都是可变长度数组。结束。

在 C++ 中,没有 整数常量表达式 并且很可能(我的猜测!)在启用 VLA 扩展的 C++ 中工作的 GNU 编译器检查数组声明中的大小表达式是否为usable in a constant expression。在 C++ 中,const 限定的整数类型可用于常量表达式,因此 const int size = 10; int my_array [size]; 是普通数组。非 const 限定的整数类型在常量表达式中不可用,因此 int size = 10; int my_array [size]; 在 C++ 中无效,在启用扩展的 GNU 编译器中会导致长度可变的数组。

Why is this code considered a VLA even though it uses an int?

"Using an int" 不一定使表达式成为常量表达式,这对于非可变长度数组的数组定义中括号内的表达式是必需的。

how are these 2 different methods considered as VLA?

对于 C,数组定义中括号内的表达式必须是常量表达式,因为它不是,这两个代码片段导致 VLA 声明。