main()
{
int i=256;
char buf[i];
}
在g ++上完美编译但在visual studio 8上出错。
任何人都知道它为什么会发生,
由于
答案 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)
C99,但Visual C++不允许。 VC ++不是基于C99。
C ++中不支持多次添加C99或与C ++功能冲突。
使用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 ++。