使用memcpy复制函数的地址空间

时间:2015-04-04 21:13:15

标签: function pointers memcpy

我已将有趣的指针类型定义为

typedef void (*fn)(void)

声明了一个指针变量:     fn var = NULL; 写了一个小功能     void fun(void){} 现在,我想使用memcpy将函数fun的地址空间复制到var变量中。我在尝试这个:     memcpy(var,& fun,sizeof(fn))

但是,当我打印var的值时,它显示垃圾或负值,并且从var调用函数会导致分段错误。 请帮助,我在哪里错了。

1 个答案:

答案 0 :(得分:1)

您的代码可能是memcpy(&var,&fun,sizeof(fn)),或者在var初始化为NULL时会立即失败。

上面的memcpy正在将fun代码的第一个字节复制到var,这不是您想要的(不是它是定义的行为)通过任何标准,它只是在您的OS /编译器上可能发生错误的行为。)

仅使用var = fun;

如果您决定使用memcpy(为了好玩或学习),您必须首先获得一个包含指向函数的指针的变量,而不仅仅是那个指针:

fn var1 = fun;
fn var2 = NULL;
memcpy(&var2,&var1,sizeof(fn));
var2();