ALLOCA - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-03-06
名称
alloca-分配自动释放的内存
语法
#包括
无效* alloca(size_t size);
说明
alloca()函数在调用者的堆栈帧中分配大小字节的空间。当调用alloca()的函数返回其调用者时,此临时空间将自动释放。
返回值
alloca()函数返回一个指向分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
alloca() | Thread safety | MT-Safe |
遵循规范
POSIX.1中没有此功能。
有证据表明alloca()函数出现在32V,PWB,PWB.2、3BSD和4BSD中。在4.3BSD中有一个手册页。 Linux使用GNU版本。
备注
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错误返回。
BUGS
如果不能扩展堆栈帧,则没有错误指示。 (但是,在分配失败之后,如果程序尝试访问未分配的空间,则该程序很可能会收到SIGSEGV信号。)
在许多系统上,不能在函数调用的参数列表内使用alloca(),因为alloca()保留的堆栈空间会出现在函数参数空间中间的堆栈上。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。