2013-10-20 147 views
4
void method(string a) { 
    int n = a.size(); 
    int array[n]; 
} 

上述代码可以使用gcc正确编译。数组的大小如何来自非常量变量?编译器是否自动将int array[n]转换为int* array = new int[n]C++声明一个基于非常量变量的数组?

+5

这是一个编译器扩展。 – chris

+3

使用'const'。使用参考。使用矢量 –

+0

使用GCC,用'-pedantic-errors'编译你的代码,然后看看它说了什么! – Nawaz

回答

6

数组的大小如何来自非常量变量?

目前,因为该编译器有一个非标准的扩展,它允许您在C++程序中使用C的可变长度数组。

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

这是一个实现细节。我相信GCC会将它放在堆栈上,就像正常的自动变量一样。如果堆栈的大小太大,它可能会或可能不会使用动态分配;我不认识我自己。

0

动态分配。关键字new将使用指针和一些分配来完成此操作。

int * ptr; 
int n = a.size(); 
ptr = new int[n]; 
+0

这样做的另一个好处是指针地址可以从函数返回,其中静态创建的数组从函数返回时从堆栈上擦除 –

+0

变量ptr可以像使用数组,例如你可以使用像[ptr [a-1]]这样的[]下标来访问数组的最后一个元素 –

+2

我认为这个缺点是你需要自己明确地管理内存并记得调用'稍后删除[]'。真的,只需使用'std :: vector'。 – jamesdlin

0

根据this编译器允许用C这个表达式++尽可能C90/99。