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;
}