memcpy 和 memmove 的模拟实现

memcpy的作用

函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果 source destination 有任何的重叠,复制的结果都是未定义的。
该函数的定义形式为
void * memcpy ( void * destination , const void * source , size_t num );
~这里解释一下为什么形参类型和返回类型是  void*
首先,在实际参数传过来之前,该函数是不知道传过来的参数类型是什么类型,而这里的 void*
就是指任意类型,就是不管你是什么类型,只要传过来,我就能进行拷贝。
而函数的返回类型是 void*,是一个指针,该指针指向的是拷贝完后目标的内存位置。
这样写的好处是可以实现函数的链式访问。

memcpy 和 strcpy 、strncpy的区别

strcpy 和strncpy 都是针对字符串使用的,是字符串函数。

而memcpy是内存操作函数

如何实现memcpy

下面是代码

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

memmove的作用

虽然已经有了memcpy这个函数,但是针对一些特殊情况却不能解决,比如说在同一个数组中进行数据的拷贝,于是,自然而然就有了memmove这个函数。

memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
其定义形式为
void * memmove ( void * destination , const void * source , size_t num );
大体上和memcpy没有什么区别

如何实现memmove

void* my_memmove(void* dest, const void*src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//前->后
		while (count--)
		{
			*(char*)dest = *(char*)(src);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (count--)
		{
			*((char*)dest+count) = *((char*)src + count);
		}
	}

	return ret;
}

这就是以上内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值