【发布时间】: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, &str1, strlen(str1)+1),我可以在释放str1 之前打印出str2,但在释放str1 之后str2 也消失了。
我知道如果我用char* 而不是void* 声明str2(并删除输出打印语句中的转换),这一切都会奏效,但如果可能的话,我想避免这种情况。
更新:我已更改示例代码以避免初始内存泄漏。
【问题讨论】:
-
你的演员阵容有误。你不想要
*(char **),你只想要(char *)。 -
另外,您最初的
malloc只不过是内存泄漏,strdup分配了自己的内存。 -
@Kevin 可能想把它放在一个答案中,因为它确实回答了他的问题。
-
完美。非常感谢。
标签: c memcpy void-pointers