alloca 在栈上分配空间,在函数返回时,由于栈框的释放而自动释放

本文详细介绍了alloca函数的功能与使用方法,该函数用于在调用者的栈帧上分配内存,并且所分配的内存会在函数返回时自动释放。文章还讨论了alloca与malloc及free的区别,以及在特定情况下的使用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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() 分配的空间会把栈上的函数参数分离开来。

参看

brk(2), longjmp(3), malloc(3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值