C 記憶體拷貝函式

2022-08-26 17:57:22 字數 1132 閱讀 1306

作用:此函式用於對記憶體進行複製,按照位元組複製。

引數:第乙個引數是目標記憶體位址,第二個引數是源記憶體位址,第三個引數是位元組數。

返回值:

返回指標和引數中的指標都是void*型別的,因為是對記憶體位元組進行複製,因此不必不必指定型別,複製完後,再將目標記憶體位址轉換成你需要型別可。

memcpy函式中,直接對記憶體進行複製,按照記憶體位址,複製指定的位元組數。若目標位址和原位址有乙個為空,或者兩個記憶體有重疊,或者拷貝元素太多到會記憶體溢位等操作都會出錯。所以使用此函式前,一定要保證傳入的引數的指標是有效的(不僅不為空,且指向的記憶體是有效的)。

作用:和memcpy一樣,但是會進行反衝區檢查,能夠暴露記憶體溢位等問題。

返回值:返回值是乙個錯誤碼。

這個版本中加入了基本的錯誤檢測。如果源緩衝大小為0,即count為0,函式返回0,什麼也不做。此函式沒有對目標指標為null的情況,不做檢查,所以你自己要注意檢查。如果指標有值,但是是無效值,函式也沒辦法檢查是否是有效記憶體,只是會蒐集這些資訊,在程式崩潰時提供除錯需要的資訊。

然後檢查源位址是否為空或count是否大於sizeinbytes,兩個條件有乙個滿足,函式中先將目標記憶體以sizeinbytes指定的大小呼叫memset函式清0.這裡可以看出,如果sizeinbytes傳入的大小超出目標緩衝區的大小,也是會帶來隱患的,一旦清除了其他程序的或者其他執行緒的記憶體,都是帶來問題,也很可能導致記憶體操作違規。所以,第二個引數的大小不能超過目標緩衝的大小,以位元組為單位。然後程式蒐集錯誤資訊,最後返回錯誤碼,並不會執行記憶體複製的過程。前面說的這是兩個條件任意乙個進入都會導致失敗,所以在蒐集資訊時,程式會對進入的條件進行判斷,然後進行蒐集。

函式memcpy_s執行完畢後返回0,所以檢查返回值是否為0不能判斷是否成功。但是返回值為非零那就是失敗了。

memmove和memcpy的作用是一樣的,唯一區別是,當記憶體發生區域性重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。

而對於第一種記憶體覆蓋情況,memcpy的這種拷貝方式是可以的。但第二種情況memcpy就會出錯,此時就需用memmove。

memmove_s和memcpy_s一樣比memmove更安全。

拷貝函式和記憶體操作拷貝

關於幾個常見函式 strcpy,strncpy,memcpy,memmove 那麼現在開始乙個乙個實現吧!include include include include define max 20 關於指標傳參時的斷言和const修飾的習慣有必要養成 比較常用的就是strcpy了 需要注意的是des...

記憶體拷貝函式 void memcpy

函式原型 void memcpy void dest,void src,int n 返回值 該函式返回乙個指向目標儲存區destin的指標。所需標頭檔案 c include cstring 應用說明 按照位元組 byte 拷貝實現的my memcpy void my memcpy void dst,...

C C 記憶體拷貝函式

1 char strcpy char dest,const char src 對字串有效,也會將src字串的 0 拷貝至目的字串中,所以在設定目的字串時注意分配合理的記憶體空間 2 char strncpy char dest,const char src,size t count 對字串有效,根據...