在不使用malloc分配内存的情况下执行memcpy

时间:2014-03-26 14:39:03

标签: c memcpy dlopen

我问自己为什么这段代码在我没有为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);

3 个答案:

答案 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); 

您正在复制到指针的地址,而不是取消引用它。这会覆盖指针变量本身的内存,而不是它指向的内容(什么都不是)。