运行时堆栈上的动态分配

shr*_*ant 2 c++

main()
{
int i=256;
char buf[i];
}
Run Code Online (Sandbox Code Playgroud)

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

谁知道为什么会这样,

谢谢

GMa*_*ckG 8

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

g++(C++编译器)是一个兄弟gcc(C编译器),并且g++被允许你使用的是C99功能,同时VS有没有这样的事情.从本质上讲,它是一个非标准的C++扩展.

如果你创建i一个编译时常量,它将起作用(因为那是标准的C++):

const int i = 256; // obviously cannot change at runtime.
Run Code Online (Sandbox Code Playgroud)

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


请注意,在C++中,您需要为其指定返回类型main.这是并且永远都是int.


Cra*_*rks 5

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

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

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

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