我已将有趣的指针类型定义为
typedef void (*fn)(void)
声明了一个指针变量: fn var = NULL; 写了一个小功能 void fun(void){} 现在,我想使用memcpy将函数fun的地址空间复制到var变量中。我在尝试这个: memcpy(var,& fun,sizeof(fn))
但是,当我打印var的值时,它显示垃圾或负值,并且从var调用函数会导致分段错误。 请帮助,我在哪里错了。
答案 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();