这是我最近想到的,引用自维基百科:“要初始化一个函数指针,你必须给它一个函数在你的程序中的地址。”
所以,我不能让它指向任意内存地址,但是如果我用一段与以前相同大小的数据覆盖函数地址处的内存,而不是通过指针调用它呢?如果此类数据对应于一个实际函数并且这两个函数具有匹配的签名,则应调用后者而不是第一个。
理论上可行吗?
如果由于一些我应该知道的非常明显的原因而无法做到这一点,我深表歉意。
最佳答案
如果您正在编写类似 JIT 的东西,它可以动态生成 native 代码,那么是的,您可以做所有这些事情。
但是,为了生成 native 代码,您显然需要了解您所在系统的一些实现细节,包括它的函数指针如何工作以及需要对可执行代码采取哪些特殊措施。例如,在某些系统上,修改包含代码的内存后,您需要刷新指令缓存,然后才能安全地执行新代码。您不能使用标准 C 或 C++ 以可移植的方式执行这些操作。
当您开始覆盖函数时,您可能会发现,您只能对程序在运行时生成的函数执行此操作。作为正在运行的可执行文件的一部分的功能可能会被操作系统标记为写保护。
关于c++ - 可以这样使用函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20356781/