之间有什么区别
void *bytes = alloca(size);
和
char bytes[size]; //Or to be more precise, char x[size]; void *bytes = x;
...其中 size 是一个在编译时值未知的变量。
答案 0 :(得分:14)
alloca()
不会回收内存,而当前块结束时,可变长度数组会回收内存。
换句话说:
void foo()
{
size_t size = 42;
if (size) {
void *bytes1 = alloca(size);
char bytes2[size];
} // bytes2 is deallocated here
}; //bytes1 is deallocated here
在任何C89编译器上都可以支持(以某种方式) alloca()
,而可变长度数组需要C99编译器。
答案 1 :(得分:6)
分配了alloca的空间一直存在,直到包含函数返回。一旦数组名称的范围结束,就会释放可变长度数组的空间。 (如果在同一个函数中同时使用可变长度数组和alloca,则可变长度数组的释放也将释放最近使用alloca分配的任何内容。)
此外,alloca
不是标准C函数,因此不能保证所有编译器都支持。可变长度数组是C99标准的一部分,因此任何支持C99的编译器都应该实现它。
答案 2 :(得分:5)
除了比利提到的观点,alloca
是非标准的(甚至在C99中都没有)。
答案 3 :(得分:0)
在第二种形式中,size
必须是编译时已知的常量。
答案 4 :(得分:0)
除了已经讨论的关于何时释放空间以及是否完全支持该构造的点,还有:
alloca
案例中,bytes
有一个指针类型。[]
案例中,bytes
有一个数组类型。最显着的区别在于sizeof(bytes)
;对于指针,它是指针的大小(sizeof(void *)
),而对于数组,它是分配空间的大小(sizeof(char) * size
,对于这种情况,它是size
,因为{{1 }} = 1)。
(另外,在您的示例中,元素类型不同;要相同,第一个应更改为sizeof(char)
。)
答案 5 :(得分:0)
最大的区别是当你将内存用作类变量时,alloca不会调用构造函数或析构函数。
其他差异不太可能被注意到,但在某些情况下可能会出现一些奇怪的运行时错误。