模拟实现memcpy:实现内存拷贝,可以不实现内存重叠拷贝,memcpy函数的功能是从源src所指的内存地址的起始位置
开始拷贝n个字节到目标dest所指的内存地址的起始位置中。way1
void* Memcpy(void* dst, const void *src, size_t n)
{
assert(dst);
assert(src);
unsigned char *dst1 = (unsigned char*)dst;
unsigned char *src1 = (unsigned char*)src;
while (n--)
{
*dst1++ = *src1++;
}
return dst;
}
way2
void * __cdecl my_memcpy(void * dst, const void * src, size_t count)
{
void * ret = dst;
while (count--)
{ // 注意, memcpy函数没有处理dst和src区域是否重叠的问题
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
模拟实现memmove:实现内存的移动,功能类似于memmove,实现内存重叠拷贝,不能使用任何库函数
way1
void *Memmove(void *dst, void *src, size_t size)
{
assert(src);
assert(dst);
unsigned char *dst1 = (unsigned char*)dst;
unsigned char *src1 = (unsigned char*)src;
if (dst <= src || dst >= (char*)src + size)
{
while (size--)
{
*dst1++ = *src1++;
}
}
else
{
*dst1-- = *src1--;
}
return dst;
}
way2
void * __cdecl my_memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))
{
//若dst和src区域没有重叠,则从起始处开始逐一拷贝
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{ // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
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);
}