【C语言学习——————内存函数介绍和模拟】

文章目录

  • memcpy
  • memmove
  • memcmp
  • 模拟实现

memcpy

memcpy是内存拷贝函数,可以用来拷贝字符串,整形数组,结构体数据等等,下面是具体的用法 

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

menmcpy的参数由一个void*类型的目标形参和一个不可更改的源void*形参以及一个更改字节个数的形参三部分组成,它可以用来复制一个内存块,将num个bytes从指向源地址的数据更改到指向目标地址的数据。(详情请参考cplusplus.com/reference/cstring/memcpy/)

memmove

memmove和memcpy一样,同样是内存函数,用法是跟memcpy相同的,但是需要注意的是,memcpy是先修改再使用,重叠拷贝时会出错,这时就可以使用memmove函数来解决以上问题,下面是具体用法

和memcpy一样函数的参数都是相同的,不同点就在于memcpy是直接复制,而memmove是复制之后再移动,相当于是缓冲区,允许重叠.

(详情参考cplusplus.com/reference/cstring/memmove/)

memcmp

memcmp函数是内存比较函数,它可以比较的是内存中储存的数据的大小,使用方法如下

 memcmp函数使用时同样具有三个形参,两个const修饰的void*类型的形参和一个需要比较的字节数的大小,若前一个字节小于后一个字节,则会返回一个小于0的整数,若相等则会返回0,若大于则会返回一个大于0的整数。

(详情参照cplusplus.com/reference/cstring/memcmp/

下面是一个memcmp的案例。

 

 

左图中是数组a的地址,右图是数组b的地址,在进行比较的时候,memcmp会一个字节一个字节的向下进行比较,当比较到0x0095FB3C和0x006FFC58时,此时b数组的元素为04,而a数组的元素为03,前一个字节要小于后一个,此时memcmp会返回一个值给ret,下面是代码的运行结果。

由此我们可以看出,以上的三个函数和字符串函数的用法非常相似,那么我们是不是可以举一反三,通过模拟来实现这几个内存修改的函数呢?

当然可以!

那么就不多做解释,直接上代码

memcpy的模拟函数

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

想要对内存进行复制,直接将源形和目标形参通过强制转换成 char* 类型然后一个字节一个字节的赋给目标形参就行了,然后再将目标形参和源形参向后移动一个字节就可以实现,是不是非常的简单

memmove 的模拟函数

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

这里通过对dest和src的比较来判断是从前往后进行复制还是从后往前进行复制,若是小于则是从前往后进行复制,若是大于则是从后往前进行复制。然后用一个ret储存一下目标形参最后返回。

 


以上就是对内存函数的介绍以及简单的模拟,由于某些原因导致前面的有点拖更,后期会加班补上。

最后如果喜欢的话别忘了点赞关注评论一波,感谢佬的三连支持

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-_Joker_-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值