ALLOCA
章节:Linux 程序员手册 (3)更新:2008-01-24
到 易美翻译 翻译 本页
名字
alloca - 分配可以自动释放的内存概要
#include <alloca.h>void *alloca(size_t size);
描述
alloca() 函数从调用者的栈桢上分配 size 个字节的空间。这个临时的空间会在调用 alloca() 的函数返回到它自身的调用者时自动释放。返回值
alloca() 函数返回一个指向被分配空间开头的指针。如果该分配操作引起栈益出,程序行为是未定义的。遵循于
这个函数不在 POSIX.1-2001。有证据显示 alloca() 函数出现在 32V、PWB、PWB.2、3BSD 和 4BSD。在 4.3BSD 上可以找到手册页。Linux 使用 GNU 的版本。
注意
alloca() 函数是机器和编译器依赖。对于特定的程序,它可以实现比 malloc(3) 加 free(3) 更高的性能。在一些使用 longjump(3) 或 siglongjump(3) 的情况下,它可以简化内在释放。对于其它情况,不推荐使用它。因为 alloca() 分配的空间是在栈桢上的,所以在函数调用 longjump(3) 或 siglongjump(3) 返回之后空间会自动释放。
不要试图在 alloca() 返回的空间上调用 free(3)!
GNU 版本的注意事项
通常情况下, gcc(1) 会把 alloc() 调用翻译成内联的代码。当使用选项 -ansi、 -std=c89、 -std=c99,或者 -fno-builtin 选项被给出(并且头文件 <alloca.h> 没有被包含时)时不会这么做。但是请注意!默认的情况下 glibc 版本的 <stdlib.h> 包含 <alloca.h> ,并且它存在一行如下的代码:#define alloca(size) __builtin_alloca (size)可能由于一些混乱而导致存在一个该函数的私有版本。
内联的代码意味着取得这个函数的地址是不可能的,或通过连接其它库来改变这个行为。
内联的代码通常只是调用一下栈指针的位置而不会检测栈溢出。所以不会有 NULL 的错误返回。
错误
没有办法指出栈桢不能被扩展。(然而,在分配缺失败之后,程序通常在试图访问没有分配的空间时会收到一个 SIGSEGV 信号。)在一些系统里 aloca() 不能使用在函数调用的参数列表里,这是因为 alloca() 分配的空间会把栈上的函数参数分离开来。