2014-01-29 79 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 *)'轉換,因爲它是代碼庫的一部分,編譯時使用嚴格標誌來處理任何警告(不使用轉換會產生)作爲錯誤。 –