我问自己为什么这段代码在我没有为fptr分配内存时效果很好。我希望它有一个 Undefined Behavior ,因为在没有为fptr分配内存的情况下执行memcpy或者?
struct conf *pconf = NULL;
void (*fptr)(char *, struct conf **);
void *temp = dlsym(dlptr, "config_run_all");
memcpy(&fptr, &temp, sizeof fptr);
fptr("test.conf", &pconf);
答案 0 :(得分:3)
您已为fptr
分配内存:
void (*fptr)(char *, struct conf **);`
这将fptr
声明为指向函数的指针。
memcpy()
将temp
的值分配到fptr
,使fptr
指向temp
指向的函数。
如果省略&
中的memcpy()
,会出现什么问题;然后,当fptr
未设置为指向任何内容时,您将尝试复制到内存中。
答案 1 :(得分:2)
您的代码基本上等同于:
struct conf *pconf = NULL;
void (*fptr)(char *, struct conf **) = (void (*)(char*, struct conf**)) dlsym(dlptr, "config_run_all");
fptr("test.conf", &pconf);
没有temp
。
答案 2 :(得分:2)
线索在memcpy调用中。
memcpy(&fptr, &temp, sizeof fptr);
您正在复制到指针的地址,而不是取消引用它。这会覆盖指针变量本身的内存,而不是它指向的内容(什么都不是)。