memcpy函数与memmove函数的实现

本文介绍了两种模拟实现memcpy和memmove函数的方法。对于memcpy,提供了两种不同的实现方式,主要负责将源地址的数据复制到目标地址;对于memmove,重点在于处理内存区域重叠的情况,确保数据正确移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟实现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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值