關於strcpy與memcpy函式的位址重疊問題

2021-08-04 17:41:58 字數 1124 閱讀 9434

大家一般認為名不見經傳strcpy函式實現不是很難,流行的strcpy函式寫法是:

[cpp]view plain

copy

char

*my_strcpy(

char

*dst,

const

char

*src)    

如果注意到:

1,檢查指標有效性;

2,返回目的指標des;

3,源字串的末尾 '\0' 需要拷貝。

寫出上面實現函式就不在話下。

然而這樣的實現沒有考慮拷貝時記憶體重疊的情況,下面的測試用例就能使呼叫my_strcp函式的程式崩潰:

[cpp]view plain

copy

char

str[10]=

"abc"

;  my_strcpy(str+1,str);  

然而呼叫系統的strcpy函式程式正常執行,列印str結果為「aabc」!可見系統strcpy函式的實現不是這樣的。

strcpy的正確實現應為:

[cpp]view plain

copy

char

*my_strcpy(

char

*dst,

const

char

*src)    

memcpy函式實現時考慮到了記憶體重疊的情況,可以完成指定大小的記憶體拷貝,它的實現方式建議檢視文章「卓越的教練是如何訓練高手的?」,會獲益良多,這裡僅粘帖函式memcpy函式的實現:

[cpp]view plain

copy

void

* my_memcpy(

void

*dst,

const

void

*src,unsigned 

intcount)  

}  else

//源位址和目的位址重疊,高位元組向低位元組拷貝

}  return

ret;  

}  

兩者結合才是strcpy函式的真正實現吧。

strcpy函式與memcpy函式

strcpy函式與memcpy函式 6.2 字串與陣列 字串一般是用字元陣列的方式儲存,例如下面的str定義 char str 123456 這裡str是乙個字元陣列,它存放了乙個字串 123456 由於字串還有乙個結束符 0 所以此陣列的長度為7而不是6。6.2.1 strcpy函式與memcpy...

strcpy函式與memcpy函式

strcpy函式與memcpy函式 6.2 字串與陣列 字串一般是用字元陣列的方式儲存,例如下面的str定義 char str 123456 這裡str是乙個字元陣列,它存放了乙個字串 123456 由於字串還有乙個結束符 0 所以此陣列的長度為7而不是6。6.2.1 strcpy函式與memcpy...

strcpy與memcpy的區別。

strcpy與memcpy的區別。考點 字串複製與記憶體複製之間的區別。出現頻率 解析strcpy和memcpy主要有以下3方面的區別。複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列 整型 結構體 類等。複製的方法不同。strcpy不需要指定長度,它遇到字串結...