memcpy,memmove,memcmp,memset内存函数

目录

memcpy内存拷贝函数

memmove函数

memcmp函数介绍

memset内存设置函数


memcpy内存拷贝函数

memcpy是内存拷贝函数,从源字符串src所指向的起始位置,拷贝到目标字符串dest的起始位置中。从src拷贝n个字节的起始位置地址到目标dest的起始位置地址。与strcpy不一样,memcpy可以拷贝任何数据,整形,字符等。而strcpy只能拷贝字符串。

  •  1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
  • 2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
  • 注意:source和destin都不一定是数组,任意的可读写的空间均可

来源于:memcpy函数的使用方法 - elegang - 博客园

memcpy会发生内存区域的重叠,如果想要处理重叠则可以使用memmove。

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

memcpy的模拟实现

void* my_memcpy(void* dest,const 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;
}
int main()
{
	//实现memcpy
	int arr1[10] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 5; i++) {
		printf("%d ", arr2[i]);
	}
}

memmove函数

 与memcpy类似,memmove可以处理重叠问题。

如果目标区域和源区域有重叠的话:
memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

来源:memcpy memmove区别和实现 - 可可西 - 博客园

memmove模拟实现

 我们可以发现当dest>src的时候,从后往前移动,当dest<src的时候从前往后

我们分别举个例子

当dest>src

当dest<src

//memmove模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	//src<dest 从后往前
	assert(dest && src);
	if (dest > src)
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
			
		}
	}
	//src>dest从前往后
	else
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}

memcmp函数介绍

 

 memcmp是内存比较函数是比较每一个字节的大小。

memset内存设置函数

 memset函数的使用

int main()
{
	char str[] = "hello,csdn";
	memset(str, '$', 5);
	printf("%s", str);
	return 0;
}

将str的前5个字符全部换成$

 这里如果改变的是数字的话只改变每一个字节。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值