使用memcpy从字符串复制到空指针时出现问题

使用memcpy从字符串复制到空指针时出现问题,c,memcpy,void-pointers,C,Memcpy,Void Pointers,我想使用memcpy将字符串复制到一个空指针(我复制到空指针的原因是,在我的实际应用程序中,我可能会复制多种类型,因此我试图做到一般),但使用下面的示例代码,我遇到了一个问题: #include <stdlib.h> #include <stdio.h> #include <string.h> int main( void ){ char *str1 = strdup("Hello"); void *str2 = malloc(strlen(str

我想使用
memcpy
将字符串复制到一个空指针(我复制到空指针的原因是,在我的实际应用程序中,我可能会复制多种类型,因此我试图做到一般),但使用下面的示例代码,我遇到了一个问题:

#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;
}
#包括
#包括
#包括
内部主(空){
char*str1=strdup(“你好”);
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);
免费(str1);
fprintf(stderr,“str2=%s\n”,*(char**)str2);
返回0;
}
在本例中,我在尝试打印
str2
时遇到分段错误。有人知道为什么这不起作用吗?将void指针强制转换为
char
,或者使用
memcpy
执行更基本的操作,这是一个问题吗?但是,如果我将
memcpy
行更改为
memcpy(str2,&str1,strlen(str1)+1)
我可以在释放
str1
之前打印出
str2
,但是在释放
str1
之后,str2也消失了

我确实知道,如果我用
char*
而不是
void*
声明
str2
(并在输出打印语句中删除强制转换),那么这一切都会起作用,但如果可能的话,我希望避免这种情况


更新:我已更改示例代码以避免初始内存泄漏。

您的强制转换错误。你不需要
*(char**)
,你只需要
(char*)
,即使这样也不是真的需要


而且,您最初的malloc只不过是内存泄漏,
strdup
分配自己的内存。

您的强制转换是错误的。你不需要
*(char**)
,你只需要
(char*)
。而且,你的首字母
malloc
只是一个内存泄漏,
strdup
分配它自己的内存。@Kevin可能想把它放在一个答案中,因为它确实回答了他的问题。太好了。非常感谢。谢谢,这正好解决了我的问题。在我的实际应用程序中,我确实需要执行
(char*)
强制转换,因为它是代码库的一部分,在代码库中,编译使用严格的标志,将任何警告(不使用强制转换将产生)视为错误。