我写了这段代码:
#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;
}
我正在尝试:
- 得到一个指向函数的指针。
- 分配函数大小的内存。
- 将函数复制到内存中。
- 将复制的内存转换为函数指针。
- 调用函数的副本。
一切正常,直到我调用“helloCpyPtr()”。此时,我遇到了段错误。
如果我想做的事情是不可能的,我也不会感到惊讶。如果不可能,我很想知道为什么不可能。
如果不是不可能的话,有人知道我在这里做错了什么吗?
谢谢堆栈溢出。
最佳答案
我希望 sizeof(*hello)
不是整个函数的大小,而是函数指针的大小(可能是 4 字节)。
我知道没有办法获得整个函数的大小,所以你提出的建议是不可能的。
其他复杂情况是许多主要的现代操作系统不允许程序从作为数据存储器创建的代码中执行代码。您的 malloc
语句创建了一个data block ,而不是code。
即使您在那里找到了说明,您也可能会得到一个 DEP (Data Execution Prevention)当您尝试调用它时出现异常。
关于我可以通过复制函数指针指向的数据来移动 C 中的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539559/