我们可以给静态数组的大小一个变量吗?
can we give size of static array a variable
大家好我想问一下我读到过我们只能通过指针和malloc或newlike来声明动态数组
int * array = new int[strlen(argv[2])];
但是我写了
int array[strlen(argv[2])];
没有错误
我读到静态数组只能通过常量数组大小来声明,但这里我给静态数组
提供了一个变量大小为什么呢?谢谢
使用它是安全的还是有可能在任何后期阶段它会产生问题我使用GCC linux
你所拥有的被称为可变长度数组 (VLA),它不是c++的一部分,尽管它是C99的一部分。许多编译器将此功能作为扩展提供。
即使是非常新的c++ 11也不包括vla,因为整个概念不适合c++ 11的高级类型系统(例如,decltype(array)
是什么?),并且c++为运行时大小的数组提供了开箱的库解决方案,这些库更强大(如std::vector
)。
在GCC中,使用-std=c++98/c++03/c++0x
和-pedantic
编译会给你一个警告
C99支持variable length array
,它在C99第6.7.5.2节中定义。
您所写的内容在C99中起作用。这是一个名为"可变长度数组"的新功能。通常不鼓励使用这些数组,因为没有接口可以使分配失败(malloc
可以返回NULL
,但如果不能分配VLA,程序将出现段错误,甚至更糟,行为不规律)。
int array[strlen(argv[2])];
这当然不是有效的c++标准代码,因为它定义了一个可变长度数组(VLA),这在任何版本的c++ ISO标准中都是不允许的。它只在C99中有效。并在非标准版本的C或c++中实现。GCC提供了VLA作为扩展,在c++中也是如此。
所以你只剩下第一个选项。但别担心,你甚至不需要这个,因为你有更好的选择。使用std::vector<int>
:
std::vector<int> array(strlen(argv[2]));
使用它。
一些编译器并不完全符合c++标准。你指出的在MinGW (iirc)中是可能的,但在大多数其他编译器(如Visual c++)中是不可能的。
在幕后实际发生的是,编译器修改代码以使用动态分配的数组。
我建议不要使用这种非标准的便利。
不安全。堆栈的大小是有限的,像这样根据用户输入从堆栈中分配有可能溢出堆栈。
对于c++,使用std::vector<>
其他人已经回答了为什么它"有效"
- 用C++中的一个变量定义一个常量
- 一个变量的输入值也会保存到另一个变量中
- 将双精度变量设置为另一个变量的值
- 对具有相同方法的不同类使用一个变量
- 为什么一个变量获得与另一个值相同的值
- 尝试在 C++ 中为 ifstream 提供一个变量
- 类中的一个变量显示,但另一个不显示
- 声明一个变量,该变量在 c++ 或 c 中具有值,当程序终止时不会被销毁
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何将一个变量用于父类和派生类
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 迭代器或反向器的一个变量
- fstream库,试图创建一个变量名为(c++)的文件
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何将一些变量放在一个变量中?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何用索引命名一个变量来存储输入 mxArray?