C++ 我们能给静态数组的大小一个变量吗

C++ 我们能给静态数组的大小一个变量吗,c++,c,C++,C,大家好,我想问的每个人,我已经读到,我们只能通过使用指针和malloc或newlike来声明动态数组 int * array = new int[strlen(argv[2])]; 但我写过 int array[strlen(argv[2])]; 它没有给我错误 我已经读到,静态数组只能通过给定常量数组大小来声明,但这里我给静态数组指定了一个变量大小 为什么会这样谢谢 使用它安全吗?或者在以后的任何阶段,它都会使我在使用gcc-linux时遇到问题吗 int array[strlen(ar

大家好,我想问的每个人,我已经读到,我们只能通过使用指针和malloc或newlike来声明动态数组

int * array = new int[strlen(argv[2])];
但我写过

int array[strlen(argv[2])];
它没有给我错误

我已经读到,静态数组只能通过给定常量数组大小来声明,但这里我给静态数组指定了一个变量大小

为什么会这样谢谢


使用它安全吗?或者在以后的任何阶段,它都会使我在使用gcc-linux时遇到问题吗

int array[strlen(argv[2])];

它当然不是有效的C++标准代码,因为它定义了一个可变长度数组(VLA),它不允许在任何版本的C++ ISO标准中使用。它仅在C99中有效。并在一个非标准版本的C或C++实现。GCC提供VLA作为扩展,在C++中也有。 所以你只有第一个选择。但别担心,你甚至不需要,因为你有更好的选择。使用

std::vector

std::向量数组(strlen(argv[2]); 使用它

>你所称的可变长度数组(VLA),它不是C++的一部分,虽然它是C99的一部分。许多编译器将此功能作为扩展提供

<> P>甚至新的C++ 11不包括VLAS,因为整个概念不适合于高级C++系统11(例如什么是代码> DECKECTORD(数组)< /CUL>?),C++提供了运行时大小的数组的箱外库解决方案,这些数组的功能更强大(如<代码> STD::向量< /代码>)。
< GCC中,编译<代码> -STD= C++ 98 /C++ 03 /C++ 0x和 -PoangNoth会给您一个警告。

< P>编译器不完全符合C++标准。您指出的在MinGW(iirc)中是可能的,但在大多数其他编译器(如visualc++)中是不可能的

在幕后实际发生的是,编译器更改代码以使用动态分配的数组


我建议不要使用这种非标准的便利设施

C99支持
可变长度数组
,它在第6.7.5.2节中定义了您在C99中编写的作品。这是一个名为“可变长度数组”的新添加。通常不鼓励使用这些数组,因为没有分配失败的接口(
malloc
可以返回
NULL
,但如果无法分配VLA,程序将出现故障或更糟的情况,行为不稳定)。

这是不安全的。堆栈的大小是有限的,并且基于用户输入进行分配(如这样)有可能使堆栈溢出

< C++ >使用<代码> STD::向量< /代码> .<
其他人已经回答了为什么它“有效”。

我有错误。先生,我使用的是gcc linux,它的工作非常好:/u在创建数组时只能使用const。like const int size=strlen(argv[2]);int数组[大小];除了这个问题,有时我想知道,甚至C99是如何处理VLA的?它如何为编译时未知的长度分配连续内存。@iammilind与任何堆栈变量的分配方式相同:从
ESP
中减去。先生,它没有给我任何错误,就像我不明白为什么。。。我所有的概念都毁了:/@mainajaved:正如我所说,它是作为扩展提供的。如果您使用的是GCC,则使用
-pedantic
选项编译程序,你会发现错误的。好的,谢谢,先生,也请给我一个使用-pendantic选项编译的例子,我没有找到任何地方,我意识到你可能回答了问题的
C++
部分,如果这个问题被认为是完全正确的,但是对于
C
问题,你的答案是完全错误的。可变长度数组是标准的,通常在堆栈上分配,Visual C不支持它们,只是因为它不兼容C99。@Pascal说得对。我编辑了答案,让我清楚地说我是在谈论C++。@ MajAjave:这是C语言的最新ISO标准,从1999开始。
std::vector<int> array(strlen(argv[2]));