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

标签 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(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 时遇到了一个 Segmentation Fault。有谁知道为什么这不起作用?将 void 指针转换为 charmemcpy 时是否存在问题?但是,如果我将 memcpy 行更改为 memcpy(str2, &str1, strlen(str1)+1) 我可以在释放之前打印出 str2 str1,但在释放 str1 之后 str2 也消失了。

我确实知道,如果我用 char* 而不是 void* 声明 str2(并删除输出打印语句),但我想尽可能避免这种情况。

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

最佳答案

你的 Actor 是错误的。你不需要 *(char **),你只需要 (char *),甚至那也不是真正必要的。

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

关于c - 使用 memcpy 从字符串复制到 void 指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443198/

相关文章:

c - 在有序对结构数组上实现二进制搜索

c - 取消引用包含对象(数组的数组)地址的出界指针

c++ - 使用 static_cast 然后使用 dynamic_cast

c - 在Rust中创建一个c_void指针

c - 为什么在 printf 中使用相等时输出为 0?

c - gcc没有这样的文件或目录错误

c - c中的memcpy后断言失败

C++ - 缓冲区合并添加额外的空值

c++ - 重新定义自定义删除

c - 如何在 Windows 上找到系统调用?