我们可以给静态数组的大小一个变量

你好每一个我想问我已经读过我们只能通过使用指针和使用malloc或newlike来声明动态数组

int * array = new int[strlen(argv[2])]; 

但我写了

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

它没有给我任何错误

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

为什么这么谢谢


是否可以安全使用,或者在任何后期阶段它都会产生问题我使用gcc linux

你所拥有的是一个可变长度数组 (VLA),它不是C ++的一部分,尽管它 C99的一部分。 许多编译器都提供此function作为扩展。

即使是非常新的C ++ 11也不包含VLA,因为整个概念不适合C ++ 11的高级类型系统(例如什么是decltype(array) ?),而C ++提供的不合适- 用于运行时大小的数组的框库解决方案,function更强大(如std::vector )。

在GCC中,使用-std=c++98/c++03/c++0x-pedantic会给出警告。

C99支持variable length array ,它在c99中定义,第6.7.5.2节。

您所写的内容适用于C99。 这是一个名为“可变长度数组”的新增function。 通常不鼓励使用这些数组,因为没有接口可以通过其分配失败( malloc可以返回NULL ,但如果无法分配VLA,程序将会出现段错误或更糟,行为不正常)。

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

它当然不是有效的C ++标准代码,因为它定义了一个在任何版本的C ++ ISO标准中都不允许的可变长度数组(VLA)。 它仅在C99有效。 并且在非标准版本的C或C ++实现中。 GCC也在C ++中提供VLA作为扩展。

所以你留下了第一个选择。 但是别担心,你甚至不需要那样,因为你有更好的选择。 使用std::vector

 std::vector array(strlen(argv[2])); 

用它。

有些编译器不完全符合C ++标准。 你在MinGW(iirc)中指出了什么,但在大多数其他编译器(如Visual C ++)中都不可能。

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

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

这不安全。 堆栈的大小有限,并且基于这样的用户输入从堆栈分配有可能溢出堆栈。

对于C ++,请使用std::vector<>

其他人已经回答了为什么它“有效”。