可能重复:
C/C++: Array size at run time w/o dynamic allocation is allowed?
在下面的清单中,buf
的明显大小由运行时常量j
确定。
编译器如何生成代码以在堆栈上分配存储(在编译时不知道j
的值)?
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
srandom(time(NULL));
int i = random();
cout<< "random number: "<<i<<endl;
if(i%2==0)
i=2;
else
i=1;
const int j=i;
char buf[j];
std::cout<<"size of buf array: "<<sizeof(buf)<<endl;
return 0;
}
答案 0 :(得分:5)
我假设你正在使用gcc,因此也就是VLA扩展。这不是标准的C ++,而是从C ++ 0x(1x)中删除。
原因在于,由于类型系统较强,C ++实现并不比C语言实现复杂得多。
真的,如果你是堆栈分配未知大小的数组,你同时编写危险的代码,可能会很好地破坏堆栈。如果您知道大小,则它不是问题,否则只是动态分配它。当然有完全有效的用例,它是一个“很好的”功能,但他们最终决定反对它。
答案 1 :(得分:4)
符合标准的C ++编译器不接受您的代码。尽管是const
,j
不是常量表达式。
gcc在C ++代码中接受这个作为扩展(根据语言标准,它只允许在C99代码中使用)。基本上,它为buf
在堆栈上分配空间。它(通常)通过从当前堆栈指针中减去一些量来实现。从生成的代码的角度来看,在典型的机器上处理非常量是非常简单的。
答案 2 :(得分:0)
编译器只需要增加堆栈大小并将buf变量指向堆栈上新创建的空间。没有理由在运行时给定大小动态不能这样做。 (尽管从编程角度来看,这可能并不明智。)