自寫記憶體操作函式

2021-07-13 03:37:14 字數 2465 閱讀 2561

【記憶體操作函式】

字串操作函式中有乙個strcpy的函式,它可以拷貝字元型別,那麼有沒有不關心型別的函式呢?這個,當然是有滴,大師們早就將他們寫到庫裡面了。

1.memcpy() 用來複製記憶體,其原型為:

void * memcpy ( void * dest, const void * src, size_t num );

memcpy() 會複製 src 所指的記憶體內容的前 num 個位元組到 dest 所指的記憶體位址上。

memcpy() 並不關心被複製的資料型別,也就是說它可以操作任意型別,只是逐字節地進行複製,這給函式的使用帶來了很大的靈活性,可以面向任何資料型別進行複製。

需要注意的是:

>>1.dest 指標要分配足夠的空間,也即大於等於 num 位元組的空間。如果沒有分配空間,會出現斷錯誤。

>>2.dest 和 src 所指的記憶體空間不能重疊(如果發生了重疊,使用 memmove()會更加安全)。

與 strcpy() 不同的是,memcpy() 會完整的複製 num 個位元組,不會因為遇到「\0」而結束。

【返回值】返回指向 dest 的指標。注意返回的指標型別是 void,使用時一般要進行強制型別轉換。

【函式實現】

#include #include #define max 20

void* my_memcpy(void *dest,const void *src,size_t count)

return pret;

}int main()

;     int brr[5]=;

int size=sizeof(brr)/sizeof(brr[0]);

int i=0;

my_memcpy(arr,brr,size);

for (i=0;i結果:

這個就將原陣列中的0乙個不漏的列印出來了,好神奇_^_^_

有了這個函式,就解決了一部分拷貝的問題,為什麼說一部分呢,接下來,聽我慢慢道來。這個時候,我有乙個問題,如果我給定乙個陣列arr[10]=;我想把它的拷貝到上去最後列印出陣列arr結果應該是;接下來看**實現:

#include void* my_memcpy(void *dest,const void *src,size_t count)

return p;

}int main()

;     int i=0;

my_memcpy(arr+6,arr+4,16);

for (i=0;i<10;i++)

printf("\n");

return 0;

}

結果:

這個結果怎麼和預先**的結果不一樣呢_~~_這就是出現上面注意的第二點dest 和 src 所指的記憶體空間不能重疊,如果出現重疊,就會出現想不到的問題。

所以此時就要用乙個memmove()的函式,他很好的處理了這個問題。

2.memmove() 用來複製記憶體內容,其原型為:

void * memmove(void *dest, const void *src, size_t num);

memmove() 與 memcpy() 類似都是用來複製 src 所指的記憶體內容前 num 個位元組到 dest 所指的位址上。不同的是,memmove() 更為靈活,當src 和 dest 所指的記憶體區域重疊時,memmove() 仍然可以正確的處理.同樣是上面的問題,具體看下它的實現:

【函式實現】

#include void *my_memmove(void *dest,const void *src,size_t count)

{     int *buf1=(int *)dest;

int *buf2=(int *)src;

int *p=(int *)dest;

if (buf1>buf2&&buf1結果:

這個結果就和預先猜想的一樣了,為什麼會一樣呢?因為當它處理有重疊時,它在拷貝時,會從後往前複製,就不會干擾到源了,所以結果正確。不重疊時,仍然和memcpy()一樣,但效率能比memcpy()

低,因為它在複製之前還要進行判斷_^_._^_

本文出自 「pzd流川楓」 部落格,請務必保留此出處

濾波(opencv自寫函式)

濾波就是把影象中的干擾給去除掉,常用的濾波方法有線性濾波,均值濾波,拉普拉斯銳化等方法。並且每一種方法都有不同的濾波模板。一 均值濾波 用模板掃瞄影象中的畫素點,把掃瞄的點求平均值,用這個平均值代替掃瞄中點。void medianfiltering iplimage img,iplimage dst...

php操作MYSQL資料庫自寫的函式

返回陣列結果 a array 連線位址 登入名 登入密碼 資料庫名 埠 a array 127.0.0.1 root 123 mysql 3306 sqlrun a,select now sqlrun function sqlrun cto array 127.0.0.1 root 123 mysq...

記憶體操作函式

calloc 配置記憶體空間 相關函式 malloc,free,realloc,brk 表頭檔案 include 定義函式 void calloc size t nmemb,size t size 函式說明 calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙...