我有以下代码:
...
int n;
cin >> n;
int numbers[n];
...
它在 Mac 上使用 g++(我认为)通过 NetBeans 进行编译,而在 Windows 上则没有使用 VS2008 进行编译。为什么让它适用于每个编译器如此困难?在分配数组之前,数组的大小是已知的。
编辑:我知道
std::vector
。实际上,这是家庭作业的一部分,我在 Mac 上开始工作,然后回到家,很惊讶它在 VS2008 上不起作用。感谢所有的答案。但我仍然觉得合乎逻辑的是,如果编译器可以生成像 alloc(123)
这样的代码,其中值 123 是硬编码的,为什么它不能生成像 alloc(n)
这样的代码,从包含 的内存地址获得
n
int n
什么的。默认情况下允许这样的事情似乎更合乎逻辑。
虽然数组的大小在分配之前就已知,但直到运行时才知道。 这称为可变长度数组 (VLA),是一种 C99 主义,在 g++ 中由默认启用的扩展支持。 明确地说,这不符合 C++ 98/03,因此 Visual C++ 完全有权拒绝它。
如果您确实想要运行时动态调整大小,请在堆上分配(通过 new[])。 这将在任何地方都有效,并且作为奖励,可以保护您免受堆栈溢出的影响。
因为数组的大小必须是标准 C++ 中的编译时常量(参见 8.3.4 §1)。
为什么不使用一些 cpp 真实的东西,比如
std::vector<int>
类似的事情可以用
完成 int* numbers = (int*)alloca(n * sizeof(int)); // equivalent to int numbers[n]
这不是推荐的功能,但如果仔细使用,会给出完全相同的结果。
根据书本,数组维度应该是一个值大于或等于 1 的常量表达式。常量表达式是指整型文字常量、枚举数或整型类型的 const 对象,它们本身是从 const 表达式初始化的。直到运行时才知道其值的非常量变量不能用于指定数组的维度。
但是我使用的编译器版本允许您提到的方式。
Visual Studio 2008 中不支持 VLA。