如果您通读 GNU libs 文档,您可以看到:
一些非 GNU 系统不支持 alloca,因此它的可移植性较差。然而,用 C 语言编写的 alloca 的较慢仿真可用于具有此缺陷的系统。
假设 VLA 也不可用, C 仿真alloca()
会是什么样子?
根据是alloca()
什么
alloca() 函数在调用者的堆栈帧中分配 size 个字节的空间。当调用 alloca() 的函数返回给它的调用者时,这个临时空间会自动释放。
实现将是特定于平台的,并且可能编译器应该意识到这一点,因为生成的代码必须尊重堆栈帧处局部变量的非固定偏移量。因此,如果您的工具链没有 VLA - 您与它无关。
由于您正在查看GNU libc 文档,您可能会考虑如何在 GCC 中进行模拟。
GCC 提供了cleanup
允许在变量超出范围时调用清理函数的属性。
void foo (void *p) {
printf("foo: %p\n", p);
}
int main(void) {
int x __attribute__((cleanup(foo)));
x = 7;
printf("%p\n", &x);
return 0;
}
在上述程序中,当x
超出范围时,foo()
将传递x
.