2014-02-09 224 views
2

從我已閱讀和理解的內容中,例如,當我們將字符串傳遞給函數時,在函數內部,我們不能使用sizeof(array)/ sizeof(array [0])來確定字符串的長度。所以我想知道它這個功能,字符追加到字符串的結尾是正確的:將字符追加到字符串末尾的函數

void append_ch_to_str(char *str, char ch) 
{ 
    int length = strlen(str); 

    str = (char *)realloc(str, (length + 1) * sizeof(char)); 

    length = strlen(str); 

    *(str + length - 1) = '\0'; 
    *(str + length - 2) = ch; 
} 
+0

我認爲這是不正確的。 – BLUEPIXY

+3

(1)字符串的長度不會改變'realloc()',所以第二個'strlen()'是多餘的。 (2)你分配的長度太小(關閉一個)。 (3)您正在使用新的更新語句寫入錯誤的位置。 (4)您沒有將分配內存的新位置傳回給調用代碼。其中,(1)最不嚴重;其他人對你的代碼的正確操作都很關鍵。 NB:'strlen()'計算字符串中的字節數直到空字節;這可能會或可能不會與分配給字符串的空間量有任何關係。 –

+0

您可能還想反覆調用此函數來考慮潛在的二次方行爲。出於許多目的,更好的接口可能是將字符串附加到字符串,其中一個字符串是特殊情況。偶爾使用,目前的設計不會受到傷害。要一次添加一個字符需要更好的工作,它需要比'char *'或'char **'更復雜的字符串類型。 –

回答

2

這是不正確的,但可以如下修正:

char *append_ch_to_str(char *str, char ch) 
{ 
    int length = strlen(str); 
    char *str2; 

    str2 = (char *)realloc(str, (length + 2) * sizeof(char)); 
    if (!str2) { 
     free(str); 
     return NULL; 
    } 
    str = str2; 

    str[length] = ch; 
    str[length+1] = 0; 

    return str; 
} 

這一切都是假設指示str指針已用malloc/calloc/strdup分配內存。

分配應該爲終止0字符提供空間,另外還有一個用於添加字符。

字符串長度的第二個計算結果會相同,因爲它會計算非零的字符,並且不會返回分配的緩衝區的大小。

如果內存不足,必須檢查realloc是否返回NULL。編輯:我添加檢查realloc返回值 - 這將hopefuly避免複製未完成的代碼...

正如在評論中指出,這也是一個壞的方法,因爲realloc不保證返回相同的指針值,這就是爲什麼該函數將返回新的指針值,並且原始指針在執行後將不再有效。

+0

對,realloc可能不會返回相同的指針。我會修好它。 – bbonev

+1

'x = realloc(x,...)'是一種反模式。如果realloc返回NULL,則泄露了用於指向的內存'x'。 (我知道你說要返回值需要檢查,但你也應該顯示它,否則,複製和粘貼將會這樣做。) – rici

+0

完全同意。更正了那個 – bbonev

1

因爲realloc可能會返回一個不同的指針,所以你會發現內存泄漏,這是你所拋出的。

也由於這個新的字符串不傳回給調用者。

+0

但是不是ference傳遞的字符串? –

+0

@ FernandoKarpinski - no - 你需要通過char ** –

+1

@FernandoKarpinski沒有任何東西在C中被引用傳遞......所有參數都是按值傳遞的。 –

相關問題