对于memcpy(void dest, const void src, size_t count),其实现机制是将src强制转换为char *类型,然后拷贝src中的count个字节拷贝至dest中,跟strcpy不同的是,memcpy函数在末尾是不会加' '的。
memmove(void dest, const void src, size_t count)与memcpy的根本区别在于,memcpy是不会考虑内存重叠的问题的,因此,memmove比memcpy更安全。
代码如下:
View Code
#include<iostream>
using namespace std;
//不考虑内存重叠,参考crt实现
/*
void *_memcpy(void *dest, const void *src, size_t count)
{
void *pAddress = dest;
if((dest == NULL) || (src == NULL) || (count < 0))
return 0;
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest+1;
src = (char *)src+1;
}
return pAddress;
}
*/
void *_memcpy(void *dest, const void *src, size_t count)
{
void *pAddress = dest;
const char *pSrc = static_cast<const char *>(src);
char *pDest = static_cast<char *>(dest);
if((dest == NULL) || (src == NULL) || (count < 0))
return 0;
while(count--)
{
*pDest++ = *pSrc++;
}
return pAddress;
}
//考虑内存重叠
void *_memmove(void *dest, const void *src, size_t count)
{
void *pAddress = dest;
const char *pSrc = static_cast<const char *>(src);
char *pDest = static_cast<char *>(dest);
//从后往前复制,避免重叠部分在复制之前被覆盖
//保证重叠区域在被覆盖之前复制到目的区域中
//与大端小端无关
if(pDest >= pSrc || pDest <= pSrc+count-1)
{
pDest += count-1;
pSrc += count-1;
while(count--)
{
*pDest-- = *pSrc--;
}
}
else
{
while(count--)
{
*pDest++ = *pSrc++;
}
}
return pAddress;
}
int main()
{
char arr1[] = "12345";
char arr2[20] = "abcdefghij";
//int arr_1 = 1234;
//int arr_2 = 4321;
//_memcpy(&arr1, &arr2, 4);
_memmove(arr2+2, arr2, 3);
cout<<arr2<<endl;
return 0;
}
原文链接: https://www.cnblogs.com/nanlou/archive/2012/10/08/2715802.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/65151
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!