C++如何基于非常量变量声明数组?

12
void method(string a) {
  int n = a.size();
  int array[n];
}

上述代码可以使用gcc编译正确。数组大小如何来自非常量变量?编译器是否会自动将int array[n]翻译为int* array = new int[n]


5
这是一个编译器扩展。 - chris
3
使用 const 关键字。使用引用。使用向量(vector)。 - Ed Heal
2
使用GCC编译您的代码时,请加上“-pedantic-errors”选项,然后查看它的输出! - Nawaz
@Nawaz:然后使用“-std=c++1y”编译并查看它的输出。 - Mike Seymour
@MikeSeymour:呵呵…… - Nawaz
3个回答

7

非常量的变量如何用来定义数组的大小?

目前,这是因为编译器有一种非标准扩展,允许在C++程序中使用C语言的变长数组。

编译器是否自动将 int array[n] 转换为 int* array = new int[n]

这是一种实现细节。我相信 GCC 将其放在堆栈上,就像普通的自动变量一样。如果大小超过堆栈限制,它可能会使用动态分配,但我自己不确定。


3
动态分配。使用new关键字可以通过指针进行动态内存分配。
int * ptr;
int n = a.size();
ptr = new int[n];

另一个好处是指针地址可以从函数返回,而静态创建的数组在函数返回时会被清除。 - Jacob Minshall
那个变量ptr可以像数组一样使用,例如,您可以使用[]下标符号,如ptr [a-1]来访问数组的最后一个元素。 - Jacob Minshall
5
我认为这种方法的一个劣势是需要手动管理内存并记得稍后调用delete[]。实际上,只需使用std::vector即可。 - jamesdlin
1
我建议在您的答案下方使用编辑按钮。然而,在C++中通常不希望使用new - chris
为什么这样呢,@chris?还有什么可以代替吗? - Jacob Minshall
2
@JacobMinshall,因为管理自己的内存会给应用程序增加不必要的复杂性。你可能会说每次使用后释放内存很简单,但如果它在一个类中,你需要额外的成员函数,再加上一些异常处理,就会有很多额外的代码。相反,使用适当的RAII容器,如std::vector或智能指针。 - chris

1
根据this,编译器允许在C++中使用此表达式,只要符合C90/99标准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接