构造指向alloca的函数指针会导致链接器错误?

l k*_*l k 3 c function-pointers alloca

我正在尝试编写一个传递给函数以用作分配参数的函数;它应该接受类型为的任何有效分配器void *(*)(size_t)。但是,在尝试alloca用作分配器时,我遇到奇怪的行为-构造指向该alloca函数的函数指针可以正常编译,但会导致链接器错误:

#include <stdlib.h>
#include <alloca.h>

int main() {
  void *(*foo)(size_t) = alloca;
}
Run Code Online (Sandbox Code Playgroud)

结果是

/tmp/cc8F67yC.o: In function `main':
test15.c:(.text+0x8): undefined reference to `alloca'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这与内联的alloca有关吗?但是当函数不需要地址时,不会仅作为优化来进行内联。实际上,使用GCC,我什至可以编写自己的版本,该版本可以在上述代码中正常运行:

static inline void *alloca(size_t n) {
  return __builtin_alloca(n);
}
Run Code Online (Sandbox Code Playgroud)

标准版本的行为方式不相同是有原因的吗?

Ant*_*ala 6

谁说你的职能

static inline void *alloca(size_t n) {
    return __builtin_alloca(n);
}
Run Code Online (Sandbox Code Playgroud)

作品?由by分配的对象__builtin_alloca会在函数结束时达到其生存期,因此,一旦返回它,您就已经有了一个悬空的指针!


bab*_*bon 5

此处引用手册页:

内联代码的事实意味着无法获取该函数的地址,也无法通过与其他库链接来更改其行为。

该页面还提到:

如果拥有此功能的私有版本,将带来混乱的后果