覆盖函数指针引发错误:非对象类型不可分配

Posted

技术标签:

【中文标题】覆盖函数指针引发错误:非对象类型不可分配【英文标题】:Overwriting function pointer raises error: non-object type is not assignable 【发布时间】:2017-06-18 19:52:59 【问题描述】:

我目前正在做一个猴子补丁 c 函数调用的演示,想法是你有一个共享的 c 文件(例如:lib.c),它在头文件 @ 中有一个名为 void foo() 的导出函数987654323@.

目前我正在尝试执行以下操作:

#include <stdio.h>
#include "lib.h"

void (*foo_original)() = NULL;
void foo_patch()
    
    puts("Before foo!");
    (*foo_original)();
    puts("Before foo!");


int main()

    foo_original = &foo;
    foo = &foo_patch;

    // Somewhere else in the code
    foo();

但是这给了我以下错误:

error: non-object type 'void ()' is not assignable

有谁知道我该如何解决这个问题?谢谢

【问题讨论】:

【参考方案1】:

这一行:

foo = &foo_patch;

不是重新分配函数指针,而是尝试重新分配函数foo本身的地址,这是不允许的,因为那是r-value。

如果您将指针foo_original 重新分配为指向foo_patch,您将得到一个无限递归循环,因为foo_patch 调用了foo_original 指向的函数。

【讨论】:

所以基本上你的意思是根本不可能覆盖foo()的地址? @paradoxis:没错。函数在名义上只执行内存中具有固定地址。

以上是关于覆盖函数指针引发错误:非对象类型不可分配的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“类型'字符串'不可分配给类型'从不'”?

Golang 引用类型介绍

推断指针非类型模板参数的类型

TS 编译器错误:类型“字符串”不可分配给类型“状态”

C++ 错误:不允许抽象类类型的对象:纯虚函数没有覆盖器

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)