如果给定的大小为0,alloca()
是否返回NULL ?
快速搜索发现alloca(0)
在某些情况下强制垃圾收集!但我最感兴趣的是返回值。
谢谢
gcc-2.95的alloca实现使用malloc本身从堆中分配内存。在该实现上下文中,alloca(0)相当于:free (/*all the memory that was allocated with alloca when the stack pointer was deaper*/)
。这是gcc-2.95的allocal .c文件注释中的一段话。
在这个实现中,alloca(0)返回NULL这个实现的一般概念是保持跟踪所有本地分配的块,并回收任何块它们被发现在堆栈中比当前更深调用。这种启发式方法不会将存储回收为它很快就会失效,但最终还是会失效的。
作为一种特殊情况,alloca(0)回收存储分配任何。在中使用alloca(0)是个好主意你的主控制循环等来强制垃圾回收。
根据这个手册,alloca
将在堆栈上分配内存,它要么成功,要么使您的程序崩溃。
现在,对于一个0字节的分配,你不应该为返回值而烦恼:因为有0字节,没有空间给你写,无论返回的指针值是0x1234
还是NULL,程序都应该崩溃。
在Windows上,_alloca(0);
返回堆栈指针(带有一些固定偏移量)。在某些特殊情况下,当C代码需要从x64
进程中知道RSP
CPU寄存器时,这可能是必要的(因为Visual Studio中不支持64位构建的内联汇编)
请记住,调用_alloca(0);
将在堆栈上分配一些内存,所以请确保不要在同一局部作用域中重复调用它,否则可能会耗尽堆栈并导致stack overflow
异常。
作为一个更好的选择,可以考虑调用_AddressOfReturnAddress()
为intrinsic。
根据Linux手册页
与
这个函数在POSIX.1-2001中没有。
指出alloca()函数依赖于机器和编译器。
所以alloca()设置0大小的元素是不合法的,但是没有定义
我没有size=0时返回值的具体示例。请看看这个问题和"GNU版本说明"。第一个链接