C 學習之記憶體重疊

2021-08-18 10:40:17 字數 1111 閱讀 1493

首先先說一下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可...