运行时const来定义数组大小

时间:2012-03-21 20:56:38

标签: c++

  

可能重复:
  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;   
}

3 个答案:

答案 0 :(得分:5)

我假设你正在使用gcc,因此也就是VLA扩展。这不是标准的C ++,而是从C ++ 0x(1x)中删除。

原因在于,由于类型系统较强,C ++实现并不比C语言实现复杂得多。

真的,如果你是堆栈分配未知大小的数组,你同时编写危险的代码,可能会很好地破坏堆栈。如果您知道大小,则它不是问题,否则只是动态分配它。当然有完全有效的用例,它是一个“很好的”功能,但他们最终决定反对它。

Here is a good run down on the subject.

答案 1 :(得分:4)

符合标准的C ++编译器不接受您的代码。尽管是constj不是常量表达式。

gcc在C ++代码中接受这个作为扩展(根据语言标准,它只允许在C99代码中使用)。基本上,它为buf在堆栈上分配空间。它(通常)通过从当前堆栈指针中减去一些量来实现。从生成的代码的角度来看,在典型的机器上处理非常量是非常简单的。

答案 2 :(得分:0)

编译器只需要增加堆栈大小并将buf变量指向堆栈上新创建的空间。没有理由在运行时给定大小动态不能这样做。 (尽管从编程角度来看,这可能并不明智。)