首先先說一下strcpy,流行的strcpy函式寫法是:
char
*my_strcpy(
char
*dst,
const
char
*src)
view plain
copy
如果注意到:
1,檢查指標有效性;
2,返回目的指標des;
3,源字串的末尾 '\0' 需要拷貝。
寫出上面實現函式就不在話下。
然而這樣的實現沒有考慮拷貝時記憶體重疊的情況,下面的測試用例就能使呼叫my_strcp函式的程式崩潰:
char
str[10]=
"abc"
; my_strcpy(str+1,str);
view plain
cop然而呼叫系統的strcpy函式程式正常執行,列印str結果為「aabc」!可見系統strcpy函式的實現不是這樣的。
strcpy的正確實現應為:
char
*my_strcpy(
char
*dst,
const
char
*src)
view pl
copmemcpy和memmov函式原型和區別
memcpy()函式從src記憶體中拷貝n個位元組到dest記憶體區域,但是源和目的的記憶體區域不能重疊。
在對待重疊區域的時候,memmove可以正確的完成對應的拷貝。
void
* my_memcpy(
void
* dst,
const
void
* src,
size_t
n)
return
dst;
} void
* my_memmove(
void
* dst,
const
void
* src,
size_t
n)
}else
} return
dst;
}
c語言學習之記憶體重疊
遇到這樣乙個問題,當陣列進行拷貝的時候,如果是在同乙個陣列內拷貝,就有可能出現記憶體重疊的問題,比如 includevoid copy int a,int b,int len b從開始複製len個數字到a int main copy arr 0 arr 3 7 4,5,6,7,8,9,10,8,9,...
C 學習筆記之記憶體分配
靜態記憶體 staitc memory 儲存區域性static物件 類static資料成員 定義在任何函式之外的變數 棧記憶體 stack 儲存定義在函式內的非static物件 自由空間 free store 或稱堆記憶體 heap 儲存動態分配 即程式執行時分配 的物件 1.分配在靜態記憶體和棧記...
c 學習之記憶體分割槽模型
c 程式在執行時,將記憶體大致分為4個取區域。區 存放函式體的二進位制 由作業系統進行管理。全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時由作業系統 在程式編譯後,生成了.exe可...