返回alloca指针

此代码是否返回对堆栈上分配的变量的无效引用? 或者是什么:

void *f(size_t sz) { return alloca(sz); } 

或者这是一个由alloca实现/编译器支持处理的特殊情况,如f(alloca(size), alloca(size))会是什么?

allocaf的堆栈帧中分配空间。 一旦函数返回(它不再是“保留”),你就无法用它做任何有用的事情。

alloca()函数在调用者的堆栈帧中分配空间的大小字节。 当调用alloca()的函数返回其调用者时,将自动释放此临时空间。

这个:

 void *f() { char* pc4 = alloca(4); ... } 

就是这样:

 void *f() { char pc4[4]; ... } 

在第二种情况下你也不能在函数外返回/使用pc4,也不能在第一种情况下做同样的事情。

是的,代码返回一个无效指针。 alloca调用无法包装成函数。 如果需要包装alloca ,则仅限于宏包装器。

正如其他人所说,它会被释放,我真的不知道你怎么能改变这种行为。 如果你看一下alloca如何在amd-64上编译:

 pushq %rbp movq %rsp, %rbp subq $144, %rsp movq %rsp, %rax addq $15, %rax shrq $4, %rax salq $4, %rax leave ret 

你看

1)Alloca实际上并不是一个函数调用(因为,正如你所说,它必须以不同的方式处理堆栈!)

2)当rbp覆盖rsp时,无论alloca对堆栈指针做什么都会在函数末尾被破坏

那么你能得到你所询问的行为(没有编写程序集)吗? 这是一个棘手的问题,我不知道,但似乎可能不是。

我自己从未使用过alloca,但我在这里读到了“内联问题”: 为什么使用alloca()不被认为是好的做法?

答案“最令人难忘的错误之一……”非常有趣。

因此,当函数超出范围时,内存肯定会被释放,这是不正确的。

根据Linux手册页 :

alloca()函数在调用者的堆栈帧中分配空间,并返回指向已分配块的指针。 当调用alloca()的函数返回时,将自动释放此临时空间。

这意味着,尝试访问f()返回的内存将导致未定义的行为,因为它在f()返回时被释放。