實現c中memcpy函式
1、memcpy庫函式
memcpy函式在C語言中的<string.h>中,在C++的<cstring>中。
函式原型:void * memcpy(void * dest, void * src, size_t num);
功能:將指標src所指向的記憶體中的num個位元組拷貝到dest中去;
庫函式中的memcpy沒有考慮記憶體重疊的情況,因此他並不是安全的。
2、函式實現
根據上一篇部落格的介紹,指出了memcpy可能會出現“記憶體重疊”的問題。
沒有考慮記憶體重疊的memcpy函式
void *my_memcpy(void *dest, const void *src, size_t count) //沒有考慮記憶體重疊情況
{
assert(dest != NULL && src != NULL);
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}
改進,考慮記憶體重疊的情況
void * my_memcpy(void *dst,const void *src,unsigned int count)
{
assert(dst != NULL);
assert(src != NULL);
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重疊,低位元組向高位元組拷貝
{
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else //源地址和目的地址重疊,高位元組向低位元組拷貝
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}
相關文章
- [C練習]實現memcpy原型函式memcpy原型函式
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- [C++]實現memcpyC++memcpy
- memmove和memcpy函式的區別及實現memcpy函式
- 實現C中的strcpy函式函式
- memmove和memcpy 以及strcmp strcpy幾個庫函式的實現memcpy函式
- strcpy函式和memcpy函式的區別函式memcpy
- strcpy,strncpy,memcpy,memmove,memset函式memcpy函式
- memcpy,memmove的實現memcpy
- C中memcpy使用注意事項memcpy
- c++字串查詢函式實現C++字串函式
- C可變引數函式 實現函式
- PHP中實現函式過載PHP函式
- (函式)實現strstr函式函式
- c語言中通過函式指標實現函式過載C語言函式指標
- C 語言實現泛型 swap 函式泛型函式
- C++ 初始化函式的實現C++函式
- [C練習]my_atoi函式實現函式
- C#函式實現的小功能集合C#函式
- C/C++—— C++中函式重寫和函式過載C++函式
- python中實現函式過載Python函式
- js中實現單分派泛函式JS函式
- PHP中實現函式過載薦PHP函式
- C++中strlen函式C++函式
- C中呼叫Lua函式函式
- C#實現函式預設值和C#4.0實現預設值C#函式
- C++模板函式實現型別推導C++函式型別
- C++中函式指標與函式物件C++函式指標物件
- c++中訊息函式 -- GetMessage函式C++函式
- 【C語言】常用的字串函式及相關函式的自我實現C語言字串函式
- 在 Python 中實現函式過載Python函式
- 在 JS 中實現 Laravel 的 ROUTE 函式JSLaravel函式
- JavaScript 中如何實現函式佇列?(一)JavaScript函式佇列
- js中trim函式的簡單實現JS函式
- java如何實現javascript中的eval函式JavaScript函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- C++11中的函式C++函式
- C# 中的本地函式C#函式