运行时堆栈上的动态分配

时间:2010-03-22 04:05:45

标签: c++

main()
{
int i=256;
char buf[i];
}

在g ++上完美编译但在visual studio 8上出错。

任何人都知道它为什么会发生,

由于

4 个答案:

答案 0 :(得分:8)

在C ++中,数组具有恒定的大小。然而,在C99中,存在称为可变长度数组或VLA的东西。这就是你在这里所做的。

g++(C ++编译器)是gcc(C编译器)的兄弟,g++允许您使用该C99功能,而VS没有这样的功能。基本上它是一个非标准的C ++扩展。

如果你使i成为编译时常量,它就可以工作(因为那是标准的C ++):

const int i = 256; // obviously cannot change at runtime.

如果您需要C ++中的动态数组,请使用std::vector


请注意,在C ++中,您需要为main指定返回类型。这一直是int

答案 1 :(得分:5)

如前所述,您所做的不是C ++标准的一部分。但是,您可以使用以下命令在C ++中的堆栈上创建可变长度数组:

{
  int length=256;
  char *buf = _alloca(length * sizeof(char)); // allocates space on the stack
      // that is freed when function returns
}

alloca()也不是标准的一部分,但gcc和Visual Studio都支持它。请注意:当您退出函数时,它分配的空间将被释放,而不是buf范围的末尾!循环中的alloca()会导致痛苦。

如果你并不绝对肯定需要将数组放在堆栈而不是堆上,那么请使用像std::vector这样的标准容器;它在堆上,但知道如何清理它自己。

答案 2 :(得分:2)

Variable length arrays允许

C99,但Visual C++不允许。 VC ++不是基于C99。

  

C ++中不支持多次添加C99或与C ++功能冲突。

Source


使用Visual C ++,您可以使用变量作为堆栈的数组大小。但它必须是一个常量表达式,并且在编译时可以确定。

您当然可以在运行时使用堆创建动态大小的数组:

char *buf = new char[i];
//do something
delete[] buf;

但大部分时间你都想使用合适的STL容器,例如std::vector

答案 3 :(得分:0)

在这种情况下,你可以使用const:

int main()
{
    const int i=256;
    char buf[i];
}

另请注意,main没有int作为返回类型是无效的C ++。