如果给定的大小为 0,是否alloca()
返回 NULL?
快速搜索显示 alloca(0)
在某些情况下强制垃圾收集!但我最感兴趣的是返回值。
谢谢
如果给定的大小为 0,是否alloca()
返回 NULL?
快速搜索显示 alloca(0)
在某些情况下强制垃圾收集!但我最感兴趣的是返回值。
谢谢
根据这个手册页,alloca
将在堆栈上分配内存,它要么成功,要么让你的程序崩溃。
现在,对于 0 字节的分配,您不必担心返回值:因为有 0 字节,所以没有空间供您写入,而且无论返回的指针值是0x1234
NULL 还是 NULL,程序都会崩溃.
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(0) 回收存储而不分配任何存储。在主控制循环等中使用 alloca(0) 来强制垃圾收集是个好主意。
顺便说一下,在这个实现中 alloca(0) 返回 NULL。
在 Windows 上,_alloca(0);
返回堆栈指针(具有一些固定的偏移量)。在某些特殊情况下,当 C 代码需要RSP
从x64
进程中了解 CPU 寄存器时,这可能是必需的(因为 Visual Studio 中的 64 位构建不支持内联汇编) .)
但请记住,调用_alloca(0);
将在堆栈上分配一些内存,因此请确保不要在同一本地范围内重复调用它,否则可能会耗尽您的堆栈并导致stack overflow
异常。
作为更好的选择,请考虑_AddressOfReturnAddress()
改为调用内在函数。