使用memcpy从字符串复制到void指针的问题

时间:2014-01-29 21:38:15

标签: c memcpy void-pointers

我想使用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*(并删除输出打印语句中的转换),它将全部工作,但我想如果可能的话,尽量避免。

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

1 个答案:

答案 0 :(得分:3)

你的演员是错的。您不想要*(char **),只需要(char *),即使这不是必需的。

此外,您的初始malloc只是内存泄漏,strdup分配自己的内存。