9

和有什么区别

void *bytes = alloca(size);

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

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

4

6 回答 6

17

alloca()直到当前函数结束才回收内存,而可变长度数组在当前块结束时回收内存。

换一种方式:

void foo()
{
    size_t size = 42;
    if (size) {
        void *bytes1 = alloca(size);
        char bytes2[size];
    } // bytes2 is deallocated here
}; //bytes1 is deallocated here

alloca()可以在任何 C89 编译器上(以某种方式)支持,而可变长度数组需要 C99 编译器。

于 2010-04-10T19:05:09.640 回答
6

来自GNU 文档

用 alloca 分配的空间一直存在,直到包含函数返回。一旦数组名称的范围结束,可变长度数组的空间就会被释放。(如果您在同一个函数中同时使用可变长度数组和 alloca,则可变长度数组的释放也将释放最近使用 alloca 分配的任何内容。)

此外,alloca它不是标准的 C 函数,因此不能保证所有编译器都支持。可变长度数组是 C99 标准的一部分,因此任何支持 C99 的编译器都应该实现它。

于 2010-04-10T19:09:55.813 回答
5

除了比利提到的一点之外,alloca它是非标准的(甚至在 C99 中也没有)。

于 2010-04-10T19:10:07.563 回答
0

在第二种形式中,size必须是编译时已知的常数。

于 2010-04-10T19:05:12.047 回答
0

除了已经讨论过的关于何时释放空间以及是否完全支持该构造的要点之外,还有以下几点:

  • 在这种alloca情况下,bytes具有指针类型。
  • 在这种[]情况下,bytes具有数组类型。

最明显的区别是什么sizeof(bytes);对于指针,它是指针 ( sizeof(void *)) 的大小,而对于数组,它是分配空间的大小 ( sizeof(char) * size,对于这种情况,它 =size因为sizeof(char)= 1)。

(另外,在您的示例中,元素类型不同;要相同,第一个应更改为 char *bytes = alloca(size)。)

于 2010-04-10T19:26:44.787 回答
0

最大的不同是,当你将内存用作类变量时,alloca 不会调用构造函数或析构函数。

The other differences are less likely to be noticed, but can become apparent in some weird run time errors in some situations.

于 2010-04-12T17:07:11.273 回答