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

有什么区别

void *bytes = alloca(size); 

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

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

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编译器。

从GNU文档 :

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

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

除了Billy提到的那点, alloca是非标准的(它甚至不在C99中)。

在第二种forms中, size必须是编译时已知的常量。

除了已经讨论的关于何时释放空间的点,以及构造是否得到支持,还有以下几点:

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

最明显的区别在于sizeof(bytes)是多少; 对于指针,它是指针的大小( sizeof(void *) ),而对于数组,它是分配空间的大小( sizeof(char) * size ,其中= size ,因为sizeof(char) = 1 )。

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

最大的区别在于,当您将内存用作类变量时,alloca不会调用构造函数或析构函数。

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