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

Jar*_*tar 7 c objective-c objective-c++ alloca

有什么区别

void *bytes = alloca(size);
Run Code Online (Sandbox Code Playgroud)

char bytes[size];  //Or to be more precise, char x[size]; void *bytes = x;
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*eal 15

alloca() 在当前函数结束之前不会回收内存,而可变长度数组在当前块结束时回收内存.

换一种方式:

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

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

  • @Billy:由char字节[size]分配的内存不保证在当前块结束时进行物理回收; 但是,当前块之后的访问不再可能. (2认同)
  • @Vlad:从技术上讲,C标准很少提及实际需要物理存储的地方,以避免对特定体系结构的任何可能的依赖.但是,即使标准中没有明确的内容,标准中的隐含含义也会导致99.9%的编译器以这种方式实现它. (2认同)

rjh*_*rjh 6

GNU文档:

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

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


Mat*_*hen 5

除了比利提到的这一点,它alloca是非标准的(它甚至不是在C99中).