了解内存函数

目录

memcpy

memcpy模拟实现

memove

memove模拟实现

memcmp

总结


memcpy

memcpy函数用于将一段内存空间的数据复制到另一个内存空间,它的函数原型为:

void *memcpy(void *dest, const void *src, size_t n);

其中,dest为目标内存空间地址,src为源内存空间地址,n为要复制的字节数。函数返回值为目标内存空间的指针。

memcpy函数的作用是将src开始的n个字节复制到dest开始的n个字节中,如果源和目标内存空间重叠,则结果可能不正确。同时,如果源或目标内存空间不可读写,则程序会崩溃。

与strcpy函数不同的是,memcpy函数复制的是一定长度的字节流,不会受到字符串结尾符'\0'的影响。因此,它可以用于复制任意类型的数据,包括字符串、结构体、数组等。

在实际编程中,memcpy函数常用于数据的拷贝、内存数据转移等场景。

memcpy模拟实现

void* my_memcpy(void* to, const void* from, size_t num)
{
	assert(to && from);
	void* ch = to;
	while (num--)
	{
		*(char*)to = *(char*)from;
		to = (char*)to + 1;
		from = (char*)from + 1;
	}
	return ch;
}

这个实现方法非常简单,就是通过循环一个一个地将字节拷贝到目标内存空间中,当然这种实现方式可能不够高效。在实际使用中,我们应该使用C标准库提供的memcpy函数来保证效率和可靠性。

memmove函数与memcpy函数类似,都是用于内存拷贝的函数,它也可以将一个内存区块中的数据复制到另一个内存区块中。但与memcpy不同的是,memmove函数对于源地址和目标地址可能出现重叠的情况也能正确处理,因此更加灵活和安全。

memove

memmove函数的函数原型为:

void *memmove(void *dest, const void *src, size_t n);

其中,dest为指向目标内存区域的指针,src为指向源内存区域的指针,n为要复制的字节数。不同于memcpy函数,memmove函数不要求源地址和目标地址是不重叠的,因此在某些情况下,memmove函数的速度可能会比memcpy函数慢。

memove模拟实现

void* my_memmove(void* to, const void* from, size_t count)
{
	assert(to && from);
	void* ch = to;
	if (from>to)
	{
		for (int i =0; i <count; i++)
		{
			*(char*)to = *(char*)from;
			to = (char*)to + 1;
			from = (char*)from + 1;
		}
	}
	else
	{
		while (count--)
		{
			*((char*)to + count) = *((char*)from + count);
		}
	}
}

该函数的实现思路是,当目标地址在源地址之前时,按照从前往后的顺序逐个复制;当目标地址在源地址之后时,按照从后往前的顺序逐个复制。这样就能正确处理源地址和目标地址可能重叠的情况。

memcmp

memcmp是一个C标准库函数,用于比较两个内存区域的内容是否相同。其函数原型为:

int memcmp(const void *s1, const void *s2, size_t n);

其中,s1s2分别是要比较的两个内存区域的起始地址,n是要比较的字节数。

如果s1s2的前n个字节完全相同,则memcmp函数返回0。如果s1s2的前n个字节中第一个不相同的字节在s1中比在s2中小,则memcmp函数返回一个小于0的值;否则返回一个大于0的值。

总结

总之,memcpy用于内存区域的复制,memmove用于内存区域的移动和复制,memcmp用于内存区域的比较。需要根据实际需求选择合适的函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值