深度剖析strcpy與memcpy

2021-09-19 18:58:26 字數 2251 閱讀 5818

1 strcpy

1.1 strcpy的功能

用於將字串從乙個地方拷貝到另外乙個地方。

1.2 strcpy函式c語言原始碼:

char *  strcpy(char* dst,const char *src)

if((src==null)||(dst==null))

return null;

char *strdst=dst;

while((*dst=*src)!="/0");

return strdst;

1.3需要特別注意的地方:

1.3.1 為什麼要有函式返回值,並且返回值型別為char *?

答:首先必須要有返回值,因為字串拷貝並不一定成功,比如傳遞的引數有問題,那麼就必須通過返回特定的值進行查錯;其次,拷貝成功後也要有返回值,肯定不應該是返回源位址值,因為它始終沒有變過,返回它毫無意義。返回目的位址才是最合理的,因為把字串從乙個地方(src指向的地方)拷貝到另外乙個地方(dst指向的地方)後接下來一般都會訪問dst指向的地方,那麼把dst的值返回給另外乙個指標變數豈不是更加合理,例如:

char table[100];

char *buf = strcpy(table,"shenzhen");

此後就可以通過buf來訪問table了。

1.3.2 為什麼函式列表的第二個形式引數要用const修飾?

答:用const修飾就可以阻止src指向的區域被有意無意修改,const修飾*src,即修飾src指向的區域,所以對該區域進行寫保護。

1.3.3 為什麼要進行引數合法性檢查?為什麼不寫成if((!dst)||(!src))?

答:①如果src的值為null,那麼就會把乙個非法區域的資料拷貝到dst指向的緩衝區中,而這很容易造成記憶體越界(因為很有可能很晚才遇到"/0"標記符或者無法遇到"/0"標記符);如果dst的值為null,那麼就相當於把一串資料拷貝到一些非法區域,從而造成系統崩潰。②因為dst和src型別為char*,並不是bool型別,雖然if((!dst)||(!src))可以進行從char*到bool的**型別轉換,但是這相當於把可靠**給了第三方去維護,顯然不是乙個合格程式設計師的素養。

1.3.4 為什麼while迴圈裡面要判斷!="/0"?為什麼while迴圈不寫成while (*strsrc!='\0') *dst++=*src++;?

答:①字串都是以"/0"作為結束標誌的,即便你寫乙個字串"shenzhen",系統也會自動在結尾增加"/0",只是你看不到而已。②這樣寫就會導致字串的"/0"無法拷貝到目的區域,這是不行的。

1.4 該函式有什麼缺陷

①如果你傳遞進來的src指向的不是字串,而是其他空間,那麼會很容易造成記憶體越界。比如

char table1[10];

int table2[11]=

strcpy(&table1,&table2);

由於table2中存放的並不是字串,因此在程式檢測到"/0"這個字串結束符之前,它會繼續將table2中的資料拷貝到table1中,從而導致記憶體越界。

1.5 總結

乙個簡單的函式的編寫足以窺視乙個程式設計師的水準。函式功能主體設計固然很重要,但是函式返回值的設計、函式引數的安排、引數關鍵字的修飾(比如const、volatile等等)以及入口引數合法性檢查,這些都是不是細節問題,而同樣是函式主體的一部分,有時甚至更為關鍵。

2 memcpy

2.1 memcpy的函式功能

用於將指定長度的資料從乙個地方拷貝到另外乙個地方

2.2 memcpy函式的c語言原始碼:

void *memcpy(void *dst,const void *src,unsigned int len)

if((null==dst)||(null==src))

return null;

char *strdst = (char *)dst;

while(len--)*dst ++=*src++;

return strdst;

2.3 需要注意的地方

①函式返回值為什麼是void *?

答:由於memcpy拷貝的資料並不限於字串,理論上可以是指向任何型別的資料指標,因此這裡設計為void *型別。

②函式形式引數為什麼是void *?

答:memcpy拷貝的資料可以是任何型別的資料,所以這裡採用void *型別。

3 strcpy和memcpy對比

3.1 strcpy只用於字串拷貝,並且是任意長度的字串拷貝;memcpy是通用型的拷貝,並且指定拷貝長度。

3.2 兩者都要有返回值,並且返回值是目的位址指標

不用庫函式,自己實現strcpy和memcpy函式

1.實現 char strcpy char strdest,const char strsrc return strdest void memcpy void pdest,const void psrc,unsigned int size return pdest 2.strcpy和memcpy的區...

編寫字串複製函式strcpy及memcpy函式

strcpy與memcpy兩函式的經典實現,哈哈,不過,不是偶寫的!char strcpy char des,const char src void memcpy void pvto,const void pvfrom,size t size 經典試題 已知strcpy函式的原型是 char str...

ifdef cplusplus深度剖析

時常在cpp的 之中看到這樣的 ifdef cplusplus extern c endif 這樣的 到底是什麼意思呢?首先,cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的 也就是說,上面的 的含義是 如果這是一段cpp的 那麼加入extern c 處理其中的 ...