2012-01-12 101 views
2

不熟悉C,請糾正我的錯誤。爲什麼c字符串被釋放?

這裏的一些代碼:

void db_cstr(char* cstr, int len) { 
    char* temp2 = cstr; 
    cstr = (char*)malloc(len*2*sizeof(char)); 
    // print 1 
    printf(cstr); 
    printf("\n"); 
    //print 2 
    printf(temp2); 
    printf("\n"); 
    strcpy(cstr, temp2); 
    //free 
    free(temp2); 
    //print 3 
    printf(cstr); 
} 
int somefunction(){ 
    int array_len = 10; 
    char* cmd = (char*)malloc(array_len*sizeof(char)); 
    strcpy(cmd, "apple"); 
    db_cstr(cmd, array_len); 
    // final print 
    printf(cmd); 
    return 1; 
} 

我的價值觀(永遠)//打印1 == 「」 和//打印2 == 「蘋果」 和//打印3 == 「蘋果」。但是,當我做最後的打印時,printf什麼都不打印。我認爲這與免費(temp2)有關;所以當我評論它最後的印刷品是「蘋果」。我相信這是因爲某些函數中的orignal cmd指針仍然指向temp2中釋放的數組。你如何讓cmd指針指向新的cstr在db_cstr中指向的內容。 (我不希望db_cstr返回任何東西)。

+1

'somefunction'中的最後一個'printf'可以打印任何東西,包括垃圾,因爲'cmd'在'db_cstr'中被釋放。你在'db_cstr'中也有內存泄漏,因爲你沒有釋放你在那個函數中分配的內存。 – 2012-01-12 13:27:38

回答

2

如果你想要一個函數來改變一個var,你應該傳遞一個指針給它。即使var是一個指針,情況也是如此。

這樣:void db_cstr(char** cstr, int len)db_cstr(&cmd, array_len);,等等...

順便說一下,不要直接printf的一個變種使用。改爲使用printf("%s",cmd)

3

以下free()s呼叫者的cmd

char* temp2 = cstr; 
free(temp2); 

因此最終printf()正在試圖打印一個已經被釋放的內存,這是不確定的行爲。

使db_cstr()返回新的指針的最簡單方法是像這樣:

char* void db_cstr(char* cstr, int len) { 
    ... 
    printf(cstr); 
    return cstr; 
} 

int somefunction(){ 
    ... 
    cmd = db_cstr(cmd, array_len); 
    ... 
} 

類似的效果可以通過使第一個參數來實現db_cstr()成指針到指針(char**)和改變代碼適當。

1

您應該返回新的指針。但是,你沒有動力地陳述,你不「想」返回任何東西。所以,我想你需要的參數指針的指針,這樣你就可以從:在函數調用者的指針更改:

void db_cstr(char **cstr, size_t len); 
0

不要在你的情況下使用printfputs。如果您沒有額外的參數將"a%sx%d"傳遞給您的printf,那麼您的程序具有未定義的行爲並會崩潰。

學習使用調試器,並打印相關字符串的地址。例如,你可能把在幾個地方類似的聲明,

fprintf(stderr, "at %s:%d cstr=%p\n", __FILE__, __LINE__, cstr); 
當然

由可能更合適的變量名稱替換cstr兩次。

0

也許最簡單的是從函數返回新的內存,而不是試圖通過指針返回它。

char* db_cstr(char* cstr, int len) { 
    char* result = malloc(len); 
    strcpy(result, cstr); 
    free(cstr); 
    return result; 
} 

那麼你會這樣稱呼它:

cmd = db_cstr(cmd, array_len); 
0

更改在cmd點地址的唯一方法是通過一個指向cmd以db_cstr。

所以,你需要重寫這樣的代碼:

void db_cstr(char** cstr, int len) { 
    char* temp2 = *cstr; 
    *cstr = (char*)malloc(len*2*sizeof(char)); 
    strcpy(*cstr, temp2); 
    free(temp2); 
} 
int somefunction(){ 
    int array_len = 10; 
    char* cmd = (char*)malloc(array_len*sizeof(char)); 
    strcpy(cmd, "apple"); 
    db_cstr(&cmd, array_len); 
    // final print 
    printf(cmd); 
    return 1; 
} 

看看db_cstr(&cmd, array_len);你是一個指針傳遞給這裏的指針。

相關問題