面試+常用-------使用strcpy的注意事項
阿新 • • 發佈:2018-12-11
首先,MSDN解釋:
strcpy 原型:char *strcpy(char *dst,char *src);
功能:把src所指的字串複製到dst所指的陣列中。
說明:src和dst所指記憶體區域不可以重疊且dst必須有足夠的空間來容納src的字串。
strcpy只是複製字串,但不限制複製的數量。
很容易造成緩衝溢位,也就是說,不過dst有沒有足夠的空間來容納src的字串,它都會把src指向的字串全部複製到從dst開始的記憶體,舉例說明:
struct A { char szAAA[5];//佔5個位元組的地址 char szBBB[5]; char szCCC[5]; A(); { memset(szAAA, 0, sizeof(szAAA)); memset(szBBB, 0, sizeof(szBBB)); memset(szCCC, 0, sizeof(szCCC)); }; }; A a; char szTemp[12] = {'a','b','c','d','e','f','g','h','i','j','k','\0'};//佔用12個位元組地址 strcpy(a.szAAA, szTemp);//會超過szAAA地址,佔用szBBB,szCCC地址,覆蓋掉
設定斷點,當strcpy執行完後,觀察這幾個成員變數的值如圖所示:
可以看到a.szBBB和a.szCCC中被賦了值,如果a.szBBB或a.szCCC的地址存放的是其他型別的變數那將會產生嚴重的後果。
為了避免這個問題,我們可以使用memcpy來完成的字串的拷貝工作,memcpy是用來在記憶體中複製資料的,
它會把指定長度的記憶體塊複製到另一塊記憶體中而不管記憶體的中存放的是什麼資料,
在這裡,我定義了一個巨集來優化memcpy的使用。
#define STRCPY(strDst, strSrc) memcpy(strDst, strSrc, min(sizeof(strDst) - 1, strlen(strSrc)))
這個巨集的使用類似strcpy,而在內部對源字串和目的字串的長度進行了比較,若源字串過長則將其長度擷取,這就保證了不過有拷貝溢位的問題,為了去除程式中潛在的strcpy問題,可在檔案的開始定義如下的巨集: #define strcpy STRCPY