strcpy memcpy和memset之間的區別

2021-08-20 11:15:03 字數 2554 閱讀 7966

今天刷題時遇到了這個問題,記錄一下。

strcpy比較簡單,就是拷貝字串,遇到'\0'時結束拷貝。

memcpy用來做記憶體拷貝,可以拷貝任何資料型別的物件並指定拷貝資料的長度:char a[100],b[50]; memcpy(b, a, sizeof(b));

總結一下:

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

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

複製的方法不同。strcpy不需要指定長度,它遇到字串結束符"\0"便結束。memcpy則是根據其第3個引數決定複製的長度。

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

//注意:如果用的是sizeof(a),則會造成記憶體洩露。  

比較複雜點的是memset,用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『\0』,比如:

char a[100];memset(a, '\0', sizeof(a));

另外比較方便的是對結構體的操作,memset可以方便的清空乙個結構型別的變數或陣列:

比如有結構體struct sample_strcut  sttest,一般清空結構體的話得用如下方式:

struct

sample_struct

;sttest.csname[0]='\0';

sttest.iseq=0;

sttest.itype=0;

而如果用memset就非常方便了:

memset(&sttest,0,sizeof(struct sample_struct));

參考:今天遇到的筆試題是實現strcpy和memcpy,當時沒做出來,網上一搜才發現是零幾年**就出過的題目,好吧。。

參考:

char *strcpy(char *des, const

char *src)

void *memcpy(void *pvto, const

void *pvfrom, size_t size)

下面看筆試題的得分點:

char* strcpy(char* strdest,const

char*strsrc)

[1] 引數檢查

(a)不檢查指標的有效性,說明設計者不注重程式的健壯性

(b)檢查指標的有效性時使用((!strdest) || (!strsrc))或(!(strdest && strsrc)),說明對c語言中型別隱式轉換沒有深刻認識,

在本例中char*轉換為bool即是型別隱式轉換,這種功能雖然靈活,但是更多的是導致出錯概率的增大和維護成本的增高

(c)檢查指標的有效性時使用((strdest==0)||(strsrc==0))說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)

會減少程式的可維護性。

0雖然簡單,但程式中可能出現很多處對指標的檢查,萬一出現筆誤,編譯器不能發現,生成的程式內含邏輯錯

誤,很難排除。而使用null代替0,如果出現拼寫錯誤,編譯器就會檢查出來。

[2] 返回值

(a)return new string("invalid arguments");,說明答題者根本不知道返回值得用途,並且它對記憶體洩露也沒有警惕心,從函式體中

返回函式體內分配的記憶體是十分危險的做法,他把釋放記憶體的義務拋給不知情的呼叫者,絕大多數情況下,呼叫者不會釋放記憶體,這導致記憶體洩露

(b)return 0;,說明答題者沒有掌握異常機制。呼叫者有可能忘記檢查返回值,呼叫者還可能無法檢查返回值(見後面的鏈式表示式)。妄想讓返回

值肩負返回正確值和異常值的雙重功能,其結果往往是兩種功能都失效。應該以丟擲異常來代替返回值,這樣可以減輕呼叫者的負擔、使錯誤不會被忽略、

增強程式的可維護性。

[3] 細節

(a)忘記儲存原始的strdest值,說明答題者邏輯思維不嚴密。

[4] 細節

(a)迴圈寫成while (*strdest =*strsrc );,同[1](b)。

(b)迴圈寫成while (*strsrc!='\0') *strdest =*strsrc ;,說明答題者對邊界條件的檢查不力。迴圈體結束後,strdest字串的末尾沒有正確地加上'\0'。

最後,為啥要返回char *?

返回strdest的原始值使函式能夠支援鏈式表示式,增加了函式的「附加值」。同樣功能的函式,如果能合理地提高的可用性,

自然就更加理想。鏈式表示式的形式如:

int ilength=strlen(strcpy(stra,strb));

又如:char * stra=strcpy(new char[10],strb);

返回strsrc的原始值是錯誤的。其一,源字串肯定是已知的,返回它沒有意義。其二,不能支援形如第二例的表示式。

其三,為了保護源字串,形參用const限定strsrc所指的內容,把const char *作為char *返回,型別不符,編譯報錯。y

strcpy,memcpy和memset的區別

strcpy函式的原型 char strcpy char dest,const char src memcpy函式的原型 void memcpy void dest,const void src,size t count memset函式的原型 memset void s,int ch,size t...

strcpy memcpy和memset之間的區別

strcpy比較簡單,就是拷貝字串,遇到 0 時結束拷貝。memcpy用來做記憶體拷貝,可以拷貝任何資料型別的物件並指定拷貝資料的長度 char a 100 b 50 memcpy b,a,sizeof b 總結一下 strcpy和memcpy主要有以下3方面的區別。複製的內容不同。strcpy只能...

記憶體重疊strcpy memcpy

詳細參考 詳細參考 已知strcpy函式的原型是 char strcpy char dst,const char src 實現strcpy函式 解釋為什麼要返回char 假如考慮dst和src記憶體重疊的情況,strcpy該怎麼實現 2.strcpy函式的形式 char strcpy char st...