memcpy函数与memmove函数的区别与模拟实现

博客介绍了memcpy和memmove函数的功能。memcpy将src的计数字节复制到dest,源和目标重叠时不保证覆盖前复制重叠区字节;memmove可确保。还提及对这两个函数进行模拟实现,并展示结果和结构。
memcpy函数
void *memcpy( void *dest, const void *src, size_t count );

经查阅:
The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.
memcpy函数将src的计数字节复制到dest。 如果源和目标重叠,则此函数不会确保在覆盖之前复制重叠区域中的原始源字节。 使用memmove处理重叠区域。

memmove函数
void *memmove( void *dest, const void *src, size_t count );

memmove函数将字节的字节数从src复制到dest。 如果源区域和目标的某些区域重叠,则memmove可确保在覆盖之前复制重叠区域中的原始源字节。

因此,两个函数的模拟实现如下:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *MyMemcpy(void *str1, void *str2, int count)
{
	assert(str1 != NULL&&str2!=NULL);
	void *ret = str1;
	while (count--)
	{
		*(char *)str1 = *(char *)str2;
		((char *)str1)++;
		((char *)str2)++;
	}
	return ret;
}
int main()
{
	int i = 0;
	int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int str2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	MyMemcpy(str1 + 2, str1, 16);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", str1[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

结果展示
在这里插入图片描述

void *MyMemmove(void *str1, void *str2, int count)
{
	assert(str1 != NULL&&str2 != NULL);
	if (str1 < str2)
	{
		while (count--)//从前往后赋值
		{
			*(char *)str1 = *(char *)str2;
			((char *)str1)++;
			((char *)str2)++;
		}
	}
	else
	{
		while (count--)//从后往前赋值
		{
			*((char *)str1 + count) = *((char *)str2 + count);
		}
	}
}
int main()
{
	int i = 0;
	int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	MyMemmove(str1 + 2, str1, 16);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", str1[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

结构展示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值