alloca(0)在各种平台上做什么和返回什么?

时间:2011-11-07 12:40:38

标签: portability libc alloca

如果给定的大小为0,那么alloca()是否返回NULL?

快速搜索显示alloca(0)强制垃圾收集在某些情况下!但我最感兴趣的是回报价值。

感谢

4 个答案:

答案 0 :(得分:2)

根据this manpagealloca将在堆栈上分配内存,它将成功,或使程序崩溃。

现在,对于0字节的分配,你不应该担心返回的值:因为有0字节,所以没有空间可供你编写,无论返回的指针值是0x1234或NULL,程序应该崩溃。

答案 1 :(得分:2)

alloca的gcc-2.95实现使用malloc本身从堆中分配内存。在该实现的上下文中,alloca(0)等同于:free (/*all the memory that was allocated with alloca when the stack pointer was deaper*/)。 这是gcc-2.95的alloca.c文件中的注释引用。

  

这种实现的一般概念是保持      跟踪所有alloca分配的块,并回收任何      被发现在堆栈中比当前更深      调用。这种启发式方法不会将存储恢复为      一旦它变得无效,但最终会这样做。

     

作为一种特殊情况,alloca(0)在没有的情况下回收存储      分配任何。使用alloca(0)是个好主意      你的主要控制循环等强制垃圾收集。

顺便说一下,在这个实现中,alloca(0)返回NULL。

答案 2 :(得分:1)

根据Linux man pages

  

符合

     

此功能不在POSIX.1-2001中。

     

备注

     

alloca()函数依赖于机器和编译器。

所以alloca()0大小的元素不合法但没有定义

当size = 0时,我没有返回值的特定示例。请在第一个链接上查看此question和“关于GNU版本的注释”

答案 3 :(得分:1)

在Windows上,_alloca(0); returns the stack pointer(带有一些固定的偏移量。)在C代码需要从{{{{1}内知道RSP CPU寄存器的某些特殊情况下,这可能是必要的。 1}}进程(因为Visual Studio中的64位版本不支持内联汇编。)

请记住,调用x64将在堆栈上分配一些内存,因此请确保不要在同一本地范围内重复调用它,否则可能耗尽堆栈并导致{{1例外。

作为一个更好的选择,请考虑改为调用_AddressOfReturnAddress()内在。