0

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

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

谢谢

4

4 回答 4

2

根据这个手册页alloca将在堆栈上分配内存,它要么成功,要么让你的程序崩溃。

现在,对于 0 字节的分配,您不必担心返回值:因为有 0 字节,所以没有空间供您写入,而且无论返回的指针值是0x1234NULL 还是 NULL,程序都会崩溃.

于 2011-11-07T13:07:27.310 回答
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(0) 回收存储而不分配任何存储。在主控制循环等中使用 alloca(0) 来强制垃圾收集是个好主意。

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

于 2017-01-31T10:09:47.510 回答
1

根据Linux手册页

符合

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

笔记

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

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

我没有 size=0 时返回值的具体示例。请在第一个链接中查看这个问题和“关于 GNU 版本的说明”

于 2011-11-07T13:25:50.457 回答
1

在 Windows 上,_alloca(0); 返回堆栈指针(具有一些固定的偏移量)。在某些特殊情况下,当 C 代码需要RSPx64进程中了解 CPU 寄存器时,这可能是必需的(因为 Visual Studio 中的 64 位构建不支持内联汇编) .)

但请记住,调用_alloca(0);将在堆栈上分配一些内存,因此请确保不要在同一本地范围内重复调用它,否则可能会耗尽您的堆栈并导致stack overflow异常。

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

于 2017-12-05T09:21:04.077 回答