我想静态定义一个2D数组。数组的大小由变量确定。 我该怎么做呢?我不想动态定义数组。我听说有办法做到这一点。
答案 0 :(得分:3)
答案是 否则你不能用C ++ 必须在编译时知道数组的大小。
int my_array[6][7]; // okay
int my_array[H][7]; // ISO C++ forbids variable length array
int my_array[6][W]; // ISO C++ forbids variable length array
int my_array[H][W]; // ISO C++ forbids variable length array
某些编译器通过自己的扩展支持Variable Length Arrays
(VLA),但 VLA 未在C ++标准中定义,因此使用VLA将不符合要求到C ++标准。
VLA是在C99 C标准中引入的。 C ++从C98的C标准中分支出来。当C引入VLA时,C ++已经有了Vectors并且不需要支持或鼓励VLA。因此,VLA从未在C ++标准中被正式接受,一些C ++编译器仍然通过编译器扩展支持VLA。
因为您标记了Q C和C ++,所以总结答案:
In C99 & versions after that : You Can
Versions before C99: You Can't
In C++(Any version): You can(through compiler extensions) but You should'nt
这是传说中的C++ FAQ,它解释了有关数组的所有内容 我从中学到了很多东西。 :)
答案 1 :(得分:1)
我不这么认为你可以静态定义它!但是你可以使用矢量,但它下面也可以为你动态分配
答案 2 :(得分:1)
如果数组的某个维度是可变的,那么大小必须是可变的,那么它必须是动态大小的 - 或者以这样的方式调整大小,使得数组的静态大小大于变量可以的最大值是
答案 3 :(得分:0)
通过“变量”,我假设你在谈论一个非常数值。
在C99中,是的:
int size = ...;
int array[size][size];
在C ++中,你不能。另一种方法是使用指针和动态分配(或者更好的是矢量)。
在C99之前的C版本中,它也是不可能的。使用malloc()
。
答案 4 :(得分:0)
这取决于变量初始化的位置和时间。如果它在编译时完成,你可以使用模板来完成它:template </* args */> struct ConstExpr{enum{value = /* math goes here */};};
,否则没有自修改代码是不可能的(我很确定这会非常危险,因为你需要改变PE所以你可以在虚拟化之前以某种方式获得你分配的空间变化。