说明

alloca()函数在调用者的堆栈帧中分配大小字节的空间。当调用alloca()的函数返回其调用者时,此临时空间将自动释放。

ALLOCA - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-03-06

另外参见

brk(2),longjmp(3),malloc(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

遵循规范

POSIX.1中没有此功能。

有证据表明alloca()函数出现在32V,PWB,PWB.2、3BSD和4BSD中。在4.3BSD中有一个手册页。 Linux使用GNU版本。

BUGS

如果不能扩展堆栈帧,则没有错误指示。 (但是,在分配失败之后,如果程序尝试访问未分配的空间,则该程序很可能会收到SIGSEGV信号。)

在许多系统上,不能在函数调用的参数列表内使用alloca(),因为alloca()保留的堆栈空间会出现在函数参数空间中间的堆栈上。

返回值

alloca()函数返回一个指向分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。

名称

alloca-分配自动释放的内存

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
alloca()Thread safetyMT-Safe

语法

#包括

无效* alloca(size_t size);

备注

alloca()函数与机器和编译器有关。对于某些应用程序,与使用malloc(3)和free(3)相比,使用它可以提高效率。在某些情况下,它还可以简化使用longjmp(3)或siglongjmp(3)的应用程序中的内存释放。否则,不建议使用。

因为alloca()分配的空间是在堆栈帧内分配的,所以如果通过调用longjmp(3)或siglongjmp(3)来跳过函数返回,则该空间将自动释放。

如果引用它的指针只是超出范围,则由alloca()分配的空间不会自动释放。

不要试图释放由alloca()分配的空间(3)!

Notes on the GNU version

通常,gcc(1)使用内联代码将调用转换为alloca()。如果指定了-ansi,-std = c89,-std = c99或-std = c11选项并且不包含标题,则不会执行此操作。否则,(不带-ansi或-std = c *选项)包含和包含以下行的glibc版本:

#ifdef  __GNUC__
#define alloca(size)   __builtin_alloca (size)
#endif

如果有人拥有此功能的私有版本,将带来混乱的后果。

内联代码的事实意味着无法获取此函数的地址,也无法通过与其他库链接来更改其行为。

内联代码通常由单个指令调整堆栈指针组成,并且不检查堆栈溢出。因此,没有NULL错误返回。

日期:2019-08-20 17:59:51 来源:oir作者:oir