【发布时间】:2011-08-17 09:57:57
【问题描述】:
我想静态定义一个二维数组。数组的大小由变量决定。 我该怎么做呢?我不想动态定义数组。我听说有办法做到这一点。
【问题讨论】:
标签: c++ c arrays memory-management definition
我想静态定义一个二维数组。数组的大小由变量决定。 我该怎么做呢?我不想动态定义数组。我听说有办法做到这一点。
【问题讨论】:
标签: c++ c arrays memory-management definition
我不认为你可以静态定义它!但是你可以使用向量,但在它下面也可以为你动态分配
【讨论】:
通过“变量”,我假设您说的是非常量值。
在 C99 中,是的:
int size = ...;
int array[size][size];
在 C++ 中,你不能。另一种方法是使用指针和动态分配(或者更好的是,向量)。
在 C99 之前的 C 版本中,这也是不可能的。使用malloc()。
【讨论】:
new 或malloc 来动态分配内存,否则对象是在堆栈上创建的。此外,new 和malloc 用于在堆上分配动态内存并将pointer 指向它。 Arrays are NOT pointers & 是的,它们是在堆栈上分配的。
如果数组的其中一个维度是可变的,那么大小必须是可变的,那么它必须是动态调整大小的 - 或者以这样一种方式调整数组的大小,即静态调整数组的大小大于变量所能承受的最大值是。
【讨论】:
答案是 No You Can in 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。因此,C++ 标准从未正式接受 VLA,一些 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,它解释了有关数组的一切。
我从中学到了很多。 :)
【讨论】:
这取决于变量的初始化位置和时间。如果它是在编译时完成的,你可以使用模板来完成它:template </* args */> struct ConstExpr{enum{value = /* math goes here */};};,否则如果没有自我修改代码是不可能的(我很确定这会非常危险,因为你需要改变 PE 所以你可以在虚拟化之前以某种方式让您分配的空间发生变化)。
【讨论】: