【问题标题】:Problems using memcpy to copy from a string to void pointer使用 memcpy 从字符串复制到 void 指针的问题
【发布时间】:2014-01-29 21:38:14
【问题描述】:

我想使用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, &amp;str1, strlen(str1)+1),我可以在释放str1 之前打印出str2,但在释放str1 之后str2 也消失了。

我知道如果我用char* 而不是void* 声明str2(并删除输出打印语句中的转换),这一切都会奏效,但如果可能的话,我想避免这种情况。

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

【问题讨论】:

  • 你的演员阵容有误。你不想要*(char **),你只想要(char *)。
  • 另外,您最初的malloc 只不过是内存泄漏,strdup 分配了自己的内存。
  • @Kevin 可能想把它放在一个答案中,因为它确实回答了他的问题。
  • 完美。非常感谢。

标签: c memcpy void-pointers


【解决方案1】:

你的演员表是错误的。你不想要*(char **),你只想要(char *),即使那样也没有必要。

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

【讨论】:

  • 谢谢,这正好解决了我的问题。在我的实际应用程序中,我确实需要执行(char *) 转换,因为它是代码库的一部分,其中编译时使用严格的标志,将任何警告(不使用转换将产生)视为错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多