我以为我了解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之间的区别,那将不胜感激。
注意:这是StackOverflow问题的链接。因此,如果这个问题出了问题,那么有人可以纠正它。
What's the difference between a VLA and dynamic memory allocation via malloc?
首先,可变长度数组在C ++中不存在。 C ++中没有可变长度数组。此答案仅适用于特定的GNU编译器扩展,以支持C ++中的可变长度数组。
为什么编译器仍然知道这甚至是VLA大小
问题不是关于“编译器知道什么”,而是关于定义。定义了术语和语言,并定义了什么是VLA,什么不是。可变长度数组定义为大小不是整数常量表达式-int vla[<not integer constant expresion>];
的数组。从C99 6.7.5.2p4:
如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型为可变长度数组类型。
什么是和不是整数常量表达式再次具有非常确定的定义。
在C中,int size = 10;
和const int size = 10;
都不是integer constant expression。因此,您显示的两个数组定义都是可变长度数组。结束。
在C ++中,没有整数常量表达式,并且很可能(我猜!)在启用VLA扩展的C ++中工作的GNU编译器会检查数组声明内的size表达式是否为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编译器中会导致长度可变的数组。
为什么此代码即使使用int仍被视为VLA?
“使用int”不一定使表达式成为常数表达式,这对于不是可变长度数组的数组定义中括号内的表达式而言是必需的。
这两种不同的方法如何被视为VLA?
至于C,数组定义中括号内的表达式必须是一个常量表达式,因为不是,这两个代码段会导致VLA声明。