2016-12-15 33 views
0

好吧,我已經看到了一些使用memcpy的strcat函數的實現。我明白這是有效的,因爲不需要分配。但是,你如何保留用結果字符串覆蓋源字符串的內容。關於strcat與memcpy的混淆

例如讓take-:

char *str1 = "Hello"; 
char *str2 = "World"; 

str1 = strcat(str1, str2); 

如何確保str2不與最終的「HelloWorld」字符串的內容覆蓋?

此外,如果字符串是什麼,但字符數組,和陣列假設有一個固定的大小,然後不的存儲器再分配如果我複製的字節成比陣列較大陣列,然後是不是不安全?

+0

假設你明白'strcat'是如何工作的(*它從不* * *)*因爲重疊而只調用UB的例子可能更多地指向我認爲*分配內存)。 – WhozCraig

+0

你知道指針是什麼嗎?你知道一個String Literar是什麼嗎? – Michi

+0

我們只是有一個問題,有關實施'的strcat()'的[代碼審查(http://codereview.stackexchange.com/questions/149812/strcat-implementation)。 OP使用了'malloc()',所以有一些與標準庫方法的討論。 –

回答

1

這不是關於不安全,它是undefined behavior

首先,你試圖修改一個字符串文字,它固有地調用UB。

其次,關於目標緩衝區的大小,引述man page重點礦山

strcat()功能追加src字符串到dest串,覆蓋終止空字節('\0')在dest的末尾,然後添加終止空字節。字符串可能不重疊,dest字符串必須有足夠的空間用於結果。如果dest不夠大,程序行爲是不可預測的; [...]

+0

是的,那麼爲什麼你會使用memcpy,如果它給你未定義的行爲?爲什麼不只是用malloc分配一個新的數組,並在那裏使用memcpy。 –

+1

@ ng.newbie這不是'strcpy'是如何設計的。如果這就是你想做的事情(動態分配,兩個緩衝區拷貝,並希望有一天會有一個'free'call),那很好,但這不是'strcpy'的設計方式,所以它並不令人震驚它不會這樣。如果你使用錯誤的函數,你只會得到未定義的行爲。這不是功能的缺陷;這是工程師使用它的缺陷。 – WhozCraig

1

我明白,這是有效的,因爲無需分配。

這是一個不正確的理解。 memcpystrcat都沒有分配內存。兩者都要求您傳遞指向足夠有效內存量的指針。如果情況並非如此,則該程序會受到未定義的行爲影響。

您發佈的代碼是受情侶的原因未定義行爲:

  1. str1指向一個字符串,它是在程序的只讀部分。

  2. str1沒有足夠的內存來保存字符串"HelloWorld"和終止空字符。

+0

和'str1'指向是一個字符串文字,反正。 –

+0

@SouravGhosh,是的,也是。 –