0
点赞
收藏
分享

微信扫一扫

memcpy,memmove,memcmp,memset内存函数

月半小夜曲_ 2022-01-31 阅读 128

目录

memcpy内存拷贝函数

memmove函数

memcmp函数介绍

memset内存设置函数


memcpy内存拷贝函数

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

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能正确地实施拷贝,但这也增加了一点点开销。

memmove模拟实现

我们分别举个例子

当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函数介绍

 

memset内存设置函数

 memset函数的使用

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

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

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

举报

相关推荐

0 条评论