你好每个我想问我已经读过我们只能通过使用指针和使用malloc或newlike来声明动态数组
int * array = new int[strlen(argv[2])];
但我写了
int array[strlen(argv[2])];
它没有给我任何错误
我已经读过静态数组只能通过给出常量数组大小来声明,但在这里我给了静态数组一个可变大小
为什么感谢
使用安全还是有可能在任何后期阶段都会出现问题我使用的是gcc linux
答案 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<>
。
其他人已经回答了为什么它“有效”。