C語言深入詳解四大記憶體函數的使用
2022-07-07 10:00:35
1.memcpy
與字串函數 strcpy 類似,也是進行拷貝。但是需要注意的是,strcpy 是針對字串進行拷貝,而 memcpy 是針對記憶體進行拷貝。
如何理解呢?strcpy 進行拷貝的時候,只能一個位元組一個位元組的拷貝,但要實現 整型、浮點型等資料型別拷貝的時候,就不得不用到 memcpy 了。
我們觀察 strcpy 的函數宣告:
char * strcpy ( char * destination, const char * source );
再觀察 memcpy 的函數宣告:
void * memcpy ( void * destination, const void * source, size_t num );
可以看到 strcpy 的侷限在於只能接收 字元型 的指標,但 memcpy 對於型別可以在函數內部實現自定義。
我們瀏覽cplusplus對引數作出的解釋:
現在我們要研究如何使用:
#include <stdio.h> #include <string.h> int main() { int dest[10] = { 0 }; int src[10] = { 1,2,3,4,5,6,7,8,9,10 }; memcpy(dest, src, 20);//拷貝 20 個位元組 return 0; }
我們從 src 陣列中,拷貝 20 個位元組的資料放到 dest 陣列中。那麼我們通過 偵錯—視窗—監視來觀察 dest 陣列中的變化:
未經 memcpy 前:
經 memcpy 後:
可以直觀地看到, dest 陣列中前 20 個位元組的內容發生了改變。
使用起來倒是不復雜,那我們能不能用自己的程式碼去模擬實現一個 memcpy 函數?
#include <stdio.h> void* AnalogMemcpy(void* dest, const void* src, unsigned int num) { void* start = dest;//定義一個記錄 dest 初始地址的指標 while (num--)//一個位元組一個位元組拷貝 { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return start;//返回此指標 } int main() { int dest[10] = { 0 }; int src[10] = { 1,2,3,4,5,6,7,8,9,10 }; AnalogMemcpy(dest, src, 20); return 0; }
我們的實現思路非常簡單,因為官方給出第三個引數的定義是:要複製的位元組數。那我們順水推舟一個位元組一個位元組的拷貝。
但是到這裡,可能會存在這樣一個問題: char 型別是一個位元組,我們使用 memcpy 時也是一個位元組一個位元組的拷貝,那為什麼 strcpy 不能拷貝整型?
在我們自己模擬實現 strcpy 的時候,拷貝的停止條件是什麼?是 src 字串碰到 '