2014-01-29 45 views
1

我想用memcpy将一个字符串复制到一个空指针(我复制到一个空指针的原因是,在我的实际应用程序中,我可以复制品种的类型,所以我想是一般的),但使用的示例代码跌破该位我碰到一个问题:使用memcpy从字符串复制到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,但释放后也消失了。

我知道它会所有的工作,如果我宣布str2char*,而不是void*(并删除输出打印语句铸造),但我想避免,如果可能的。

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

+0

您的剧组导演错误。你不想'*(char **)',你只需要'(char *)'。 – Kevin

+2

另外,你的初始'malloc'只是内存泄漏,'strdup'分配它自己的内存。 – Kevin

+2

@凯文可能想要把它放在答案中,因为它确实回答了他的问题。 – Avery3R

回答

3

您的剧组导演错误。你不想要*(char **),你只需要(char *),即使这不是真的有必要。

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

+0

谢谢,这完全解决了我的问题。在我的实际应用程序中,我确实需要执行'(char *)'转换,因为它是代码库的一部分,编译时使用严格标志来处理任何警告(不使用转换会产生)作为错误。 –