为什么这段代码被认为是VLA,尽管它使用的是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;
实际上不是常量,这意味着编译器不知道这个大小是否为10,它将其视为变量。
所以,如果任何人能弄清楚C++中变量和常量之间的区别,那将是非常感激的。
注意:这是指向StackOverflow问题的链接。所以,如果这个问题有错,有人可以改正。What's the difference between a VLA and dynamic memory allocation via malloc?
解决方案
首先,C++中不存在变长数组。C++中没有可变长度的数组。此答案仅适用于在C++中支持可变长度数组的特定GNU编译器扩展。
编译器仍然知道为什么这是一个VLA大小
问题不是关于"编译器知道什么",而是关于定义。定义了术语和语言,并定义了什么是VLA,什么不是。可变长度数组定义为大小不是整数常量表达式-int vla[<not integer constant expresion>];
的数组。发件人:C99 6.7.5.2p4:
如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。
什么是和不是整数常量表达式又有一个非常确定的定义。
在C中,具有int size = 10;
和const int size = 10;
两个定义的size
作为表达式不是integer constant expression。因此,您显示的两个数组定义都是可变长度数组。结束。
在C++中,没有整数常量表达式,很可能(我猜!)在启用了VLA扩展的C++中工作的GNU编译器会检查数组声明中的大小表达式是否为usable in a constant expression。在C++中,常量限定的整型可以在常量表达式中使用,因此const int size = 10; int my_array [size];
是普通数组。不是常量限定的整型在常量表达式中不可用,因此int size = 10; int my_array [size];
在C++和启用了扩展的GNU编译器中无效,从而产生可变长度数组。
为什么此代码即使使用int也被视为VLA?
"使用int"不一定使表达式成为常量表达式,这对于不是可变长度数组的数组定义内的括号内的表达式是必需的。
这两种不同的方法如何被视为VLA?
对于C,数组定义中括号内的表达式必须是常量表达式,因为它不是,这两个代码片段导致VLA声明。
相关文章