我可以通过复制函数指针指向的数据来移动 C 中的函数吗?

标签 c function-pointers

我写了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hello(){
        puts("hey");
}

int main(){

        char* helloCpy = (char*)malloc(sizeof(*hello));

        strcpy(helloCpy, (char*)&hello);
        void (*helloCpyPtr)() = (void (*)()) helloCpy;

        hello();
        helloCpyPtr();

        return 0;
}

我正在尝试:

  1. 得到一个指向函数的指针。
  2. 分配函数大小的内存。
  3. 将函数复制到内存中。
  4. 将复制的内存转换为函数指针。
  5. 调用函数的副本。

一切正常,直到我调用“helloCpyPtr()”。此时,我遇到了段错误。

如果我想做的事情是不可能的,我也不会感到惊讶。如果不可能,我很想知道为什么不可能。

如果不是不可能的话,有人知道我在这里做错了什么吗?

谢谢堆栈溢出。

最佳答案

我希望 sizeof(*hello) 不是整个函数的大小,而是函数指针的大小(可能是 4 字节)。

我知道没有办法获得整个函数的大小,所以你提出的建议是不可能的。

其他复杂情况是许多主要的现代操作系统不允许程序从作为数据存储器创建的代码中执行代码。您的 malloc 语句创建了一个data block ,而不是code

即使您在那里找到了说明,您也可能会得到一个 DEP (Data Execution Prevention)当您尝试调用它时出现异常。

关于我可以通过复制函数指针指向的数据来移动 C 中的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539559/

相关文章:

c++ - 是否可以在 C++ 中将指向类成员的指针作为单个参数传递?

c - 为什么函数要用括号括起来?

c++ - 客户端在 BIO_do_connect 上返回 -1

c - 如何反汇编一个剥离的应用程序的主要功能?

c - 在指向指针链的指针末尾初始化值

C 数组错误 - 要求我声明同一个变量两次

C 链表使用指针removeLast

c - fscanf() 的输出无效

c - 在C中使用函数指针有效吗?

c++ - 在 1 条语句中将自定义函数作为模板参数传递