【无标题】朴实无华内存函数

本文详细介绍了C语言中的内存复制函数memcpy和memmove。针对memcpy,讲解了其函数声明、使用方法和自己实现的过程,并指出当源和目标区域有重叠时可能出现的问题。随后介绍了memmove函数,它是为了解决memcpy在处理重叠区域时的不足,通过分析不同场景下的赋值方向确保正确性。
摘要由CSDN通过智能技术生成

1.1memcpy

函数声明

void * memcpy ( void * destination , const void * source , size_t num );
函数 memcpy source 的位置开始向后复制 num 字节 的数据到 destination 的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果 source destination 有任何的重叠,复制的结果都是未定义的。

函数使用

 函数模仿

既然会用了,不如在学会写,卷死他们。

首先先分析下函数声明:

void * memcpy ( void * destination, const void * source, size_t num );

无返回值。

然后函数里面是void*, 至于为什么要用void*:让我们换位思考下,假如我们现在是函数作者,是否知道用户要穿的是int* 还是char*?这是不可能知道的,因此我们需要个不挑食的“胖子”, void*。void*可以接收所有类型。   num就是要交换的字节数量。

函数具体实现方法

 有图有真相。上代码。

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

	}
}

上图解释代码:

函数不足

我们实现了函数,知道了内部表达。但是函数不足不知道有没有发现:如果sourcedestination有任何的重叠,复制的结果都是未定义的。

这句话是什么意思呢?

假如你让一个数组中前3个元素替换第2,3, 4个元素,这就有重叠了2,3。(在有些先进编译器是可以实现的,但在很多老版编译器中是实现不了的。)

那么,这样的缺陷需要怎么做?我们下面介绍新的函数:memmove完美解决了这个问题。

1.2 memmove

函数声明

void * memmove ( void * destination , const void * source , size_t num );
memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

函数使用

  函数模仿

这不得卷一下?

函数具体实现方法

请大家想一下,我们是否可以照搬用memmcpy的实现方法来实现?

我们来设想这样两个场景,一个是dest(接受地址的变量)> src(接受地址的变量)

另一个是dest  <  src。

上图:dest  >  src.

 而当src > dest的时候,结果正好相反。就不能从后向前,不然也会出现覆盖现象,要从前向后。这样的话,我们就发现dest > / < src 是一个分水岭,而如果没有重叠的时候,从前到后和从后到前都是可以实现赋值操作的。

上代码:

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	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);
		}
	}
}

、其实没啥好说的了。。。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值