alloca(n)和char x [n]之间有什么区别?

时间:2010-04-10 19:02:39

标签: c objective-c objective-c++ alloca

之间有什么区别
void *bytes = alloca(size);

char bytes[size];  //Or to be more precise, char x[size]; void *bytes = x;

...其中 size 是一个在编译时值未知的变量。

6 个答案:

答案 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)

来自GNU documentation

  

分配了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不会调用构造函数或析构函数。

其他差异不太可能被注意到,但在某些情况下可能会出现一些奇怪的运行时错误。