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

时间:2011-10-08 11:49:09

标签: c++ c

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

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

但我写了

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

它没有给我任何错误

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

为什么感谢


使用安全还是有可能在任何后期阶段都会出现问题我使用的是gcc linux

6 个答案:

答案 0 :(得分:15)

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

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

在GCC中,使用-std=c++98/c++03/c++0x-pedantic进行编译会给您一个警告。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

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

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

使用它。

答案 4 :(得分:1)

某些编译器不完全符合C ++标准。您在MinGW(iirc)中指出的是可行的,但在大多数其他编译器(如Visual C ++)中它是不可能的。

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

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

答案 5 :(得分:1)

这不安全。堆栈的大小有限,根据这样的用户输入从堆栈中分配可能会溢出堆栈。

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

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