Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可变长度数组何时合法? 我不是C++专家,但据我所知,由于大小,代码不应该是常数: #include<iostream> using namespace std; int main(int argc, char** argv) { int size = *argv[1] - 48; char array [size]; cout<<sizeof(array)<<endl; return 0; }_C++_Gcc - Fatal编程技术网

可变长度数组何时合法? 我不是C++专家,但据我所知,由于大小,代码不应该是常数: #include<iostream> using namespace std; int main(int argc, char** argv) { int size = *argv[1] - 48; char array [size]; cout<<sizeof(array)<<endl; return 0; }

可变长度数组何时合法? 我不是C++专家,但据我所知,由于大小,代码不应该是常数: #include<iostream> using namespace std; int main(int argc, char** argv) { int size = *argv[1] - 48; char array [size]; cout<<sizeof(array)<<endl; return 0; },c++,gcc,C++,Gcc,这是一个C99特性,允许你在栈上声明这样的数组。 这是一个非标准的GCC扩展。其他的编译器(如VisualC++)不支持。 < P>即使没有VLA扩展,当编译器没有推断出编译时的维度表达式不知道时,代码也可以编译。它仍然是UB.< /P> < P>,因为你不调用G++作为C++编译器。如果我尝试它,我得到警告,清楚地表明“ISO C++禁止可变长度数组”。但是我的Mag文件包含了选项 -STD= C++ 98 ,至少在我要编译便携C++时。 < P>这里是一个添加了./P> 另请参见(ISO/I

这是一个C99特性,允许你在栈上声明这样的数组。

这是一个非标准的GCC扩展。其他的编译器(如VisualC++)不支持。

< P>即使没有VLA扩展,当编译器没有推断出编译时的维度表达式不知道时,代码也可以编译。它仍然是UB.< /P> < P>,因为你不调用G++作为C++编译器。如果我尝试它,我得到警告,清楚地表明“ISO C++禁止可变长度数组”。但是我的Mag文件包含了选项<代码> -STD= C++ 98 ,至少在我要编译便携C++时。

< P>这里是一个添加了./P>
另请参见(ISO/IEC 9899:201x委员会草案-2010年12月2日N1548)的$6.7.6.2/4数组声明器,其中有详细说明。

要从堆栈或堆为变量分配内存,需要知道变量的大小。C++编译器可以自行决定如何分配内存,但是C++已经公开了他们希望C++编译器如何处理这种情况,因此C++ STD要求编译器供应商发布他们的内存处理。这是通过sizeof操作符实现的。此运算符完全在编译时计算。数组大小的编译时限制来自此要求

int arr[10];
std::cout << sizeof(arr) << std::endl
int-arr[10];

STD:CUT< P> <代码> C99 < /Cuff>支持可变长度数组(<代码> VLA<代码> >),但既不<代码> C90也不C++支持可变长度数组,但GCC 支持这一点,如果您用这些参数编译:

,您可以更清楚地看到这一点。
gcc -std=c89 -pedantic
这将给您以下警告:

warning: ISO C90 forbids variable length array ‘array’ [-Wvla]
或使用
g++

g++ -pedantic
将向您发出以下警告:

warning: ISO C++ forbids variable length array ‘array’ [-Wvla]
gcc
手册中的本节将详细介绍。需要注意的是,在2011 C标准的可变长度数组(VL< /COD>)中,现在是可选的。< /P>但是:没有C++标准从C99接受VLAs,所以从技术上讲C++中允许VLAs是一个<代码> G++<代码>扩展。
warning: ISO C++ forbids variable length array ‘array’ [-Wvla]