如果给定的大小为0,那么alloca()
是否返回NULL?
快速搜索显示alloca(0)
强制垃圾收集在某些情况下!但我最感兴趣的是回报价值。
感谢
答案 0 :(得分:2)
根据this manpage,alloca
将在堆栈上分配内存,它将成功,或使程序崩溃。
现在,对于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)
符合
此功能不在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()
内在。