程序由三部分组成:文本、数据和堆栈。函数体位于文本部分。我们可以让函数体存在于堆上吗?因为我们可以更自由地操作堆上的内存,所以我们可能会获得更多的自由来操作函数。
在下面的 C 代码中,我将 hello 函数的文本复制到堆上,然后将函数指针指向它。该程序可以通过 gcc 编译良好,但在运行时会出现“分段错误”。
你能告诉我为什么吗?如果我的程序无法修复,您能否提供一种让函数驻留在堆上的方法?谢谢!
图灵机器人
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void
hello()
{
printf( "Hello World!\n");
}
int main(void)
{
void (*fp)();
int size = 10000; // large enough to contain hello()
char* buffer;
buffer = (char*) malloc ( size );
memcpy( buffer,(char*)hello,size );
fp = buffer;
fp();
free (buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)