strcpy和memcpy的區別

2021-06-22 01:42:07 字數 1812 閱讀 7254

strcpy和memcpy都是標準c庫函式,它們有下面的特點。

strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。

strcpy函式的原型是:

#include

char

*strcpy

(char

*destination,

const

char

*source)

;

傳回值是destination字元陣列或是配置在儲存器的字元指標(或是字串指標)。

char

*str1 =

malloc

(large_number)

;char

*str2 =

malloc

(large_number)

;fgets

(str1, large_number, stdin)

;strcpy

(str2, str1)

;/* 這行程式碼類似 str2 "=" str1 */

前兩行程式碼是先配置儲存器,經由

malloc 函式把配置完成的儲存器位址,傳回給

str1 和

str2。到了下一行程式碼,指向 str1 的儲存器,會被使用者輸入的字串填滿。之後,複製 str1 字串到 str2 的儲存器區塊內。雖然

str2 = str1 這個程式敘述可以出現類似的現象,但是它只能複製位址從

str1 到

str2,讓

str2 指向

str1 的儲存器,實際上也無法真正做到複製字串的動作。這就是

str1 和

str2 兩個指標都指向相同的儲存器區塊位址。這相當於所謂的

shallow copy(淺複製),因為

str2 實際上沒有真正從

str1 複製到字串,所以這兩個指標所指的其實都是同乙個的字串。

char * strcpy(char * dest, const char * src) // 實現src到dest的複製

char *strdest = dest; //儲存目標字串的首位址

while ((*strdest++ = *strsrc++)!='\0'); //把src字串的內容複製到dest下

return strdest;

}

必須注意使用

strcpy 函式,因為如果**字串的長度太長,當複製到目的緩衝器時,它會改寫到連線目的緩衝器後方的儲存器,導致無法預期的結果。而且程式通常容易會出現

segmentation fault(區段錯誤,也就是常見的例外現象),但是熟練的黑客會利用

快取溢位來破解進入作業系統

memcpy提供了一般記憶體的複製。即memcpy對於需要複製的內容沒有限制,因此用途更廣。

void *memcpy(void *memto, const void *memfrom, size_t size)

strcpy和memcpy主要有以下3方面的區別。

1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2、複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。

3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

參考資料

strcpy和memcpy的區別

strcpy和memcpy都是標準c庫函式,它們有下面的特點。strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。已知strcpy函式的原型是 char strcpy char dest,const char src memcpy提供了一般記...

strcpy和memcpy的區別

strcpy和memcpy都是標準c庫函式,它們有下面的特點 strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。已知strcpy函式的原型是 char strcpy char dest,const char src memcpy提供了一般記...

strcpy和memcpy的區別

strcpy和memcpy都是標準c庫函式,它們有下面的特點。strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。已知strcpy函式的原型是 char strcpy char dest,const char src memcpy提供了一般記...