欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言模拟实现memcpy,memmove函数

程序员文章站 2022-05-13 16:42:36
 这里memcpy与memmove函数的模拟实现,需要用到空指针来传递参数,之后强制类型转换为char型,用size_t这个宏接受偏移量进行偏移,模拟实现如下: &nb...
 这里memcpy与memmove函数的模拟实现,需要用到空指针来传递参数,之后强制类型转换为char型,用size_t这个宏接受偏移量进行偏移,模拟实现如下:

    memcpy函数:

 

void* my_memcpy(void*dst,const void*src ,size_t count)
{
assert(dst);
assert(src);
void* ret = dst;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}

 

 

    memmove函数:

    memmve函数是为了避免memcpy函数出现的内存重叠(上篇提到过),而开发的新函数,思想就是,如果有内存重叠的情况,那我们从后向前拷贝,如果没有,就如memcpy一样,从前向后拷贝,实现代码如下:

 

void* my_memmove(void*dst, const void*src, size_t count)
{
assert(dst);
assert(src);
void*ret = dst;
if ((char*)dst > ((char*)src + count))//判断是否内存重叠
{
while (count--)
{
*((char*)dst + count) = *((char*)src + count);
}
}
else
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
return ret;
}

 

 

    进行内存拷贝,比字符串拷贝要多传递一个拷贝偏移量的参数,因为字符串拷贝往往是遇到0就停止拷贝,而内存拷贝不存在此类问题,运用这两类函数需要思考怎样才能高效地让程序运行。