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提供了一般記...