我想使用memcpy
将字符串复制到void指针(我复制到void指针的原因是在我的实际应用程序中我可以复制各种类型,所以我是试图通用),但使用下面的示例代码,我遇到了一个问题:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main( void ){
char *str1 = strdup("Hello");
void *str2 = malloc(strlen(str1)+1);
fprintf(stdout, "str1 = %s\n", str1);
memcpy(str2, str1, strlen(str1)+1);
fprintf(stderr, "str2 = %s\n", *(char **)str2);
free(str1);
fprintf(stderr, "str2 = %s\n", *(char **)str2);
return 0;
}
在此示例中,我在尝试打印str2
时遇到分段错误。有谁知道为什么这不起作用?将void指针强制转换为char
或者memcpy
更基本的东西是一个问题吗?但是,如果我将memcpy
行更改为memcpy(str2, &str1, strlen(str1)+1)
,我可以在释放str2
之前打印str1
,但在释放str1
str2
之后消失了。
我知道如果我用str2
而不是char*
声明void*
(并删除输出打印语句中的转换),它将全部工作,但我想如果可能的话,尽量避免。
更新:我已更改示例代码以避免初始内存泄漏。
答案 0 :(得分:3)
你的演员是错的。您不想要*(char **)
,只需要(char *)
,即使这不是必需的。
此外,您的初始malloc只是内存泄漏,strdup
分配自己的内存。