c函数:memcpy、memmove函数

memcpy函数、memmove函数

1、都是以字节为基本单位操作;
2、查询msdn对二者的解释:
    memcpy函数:
    (1)Copies characters between buffers.( 在缓冲区之间复制字符)
    ( 2)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的计数字节复制到目标。如果源字节和目标字节重叠,则此函数无法确保重叠区域中的原始源字节在被覆盖之前被复制。使用memmove处理重叠区域)
    memmove函数:
    (1)Moves one buffer to another.(将一个缓冲区移动到另一个缓冲区
    (2)The memmove function copies count bytes of characters from src to dest. If some regions of the source area and the destination overlap, memmove ensures that the original source bytes in the overlapping region are copied before being overwritten.(memmove函数将字符的计数字节从src复制到目标。如果源区域和目标区域的某些区域重叠,memmove将确保重叠区域中的原始源字节在被覆盖之前被复制
3、根据上述解释模拟实现memcpy函数和memmove函数
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<Windows.h>

//模拟实现memcpy:以字节位基本操作单位
//赋值数字节长度的内存;以空指针类型来接收
void *my_memcpy(void *des, const void *src, int size)
{
	//字节为单位:强转一个字节为单位的类型
	assert(des);
	assert(src);
	char *des_ch = (char *)des;
	unsigned char * src_ch = (unsigned char *)src;
	while (size){
		*des_ch = *src_ch;
		des_ch++, src_ch++;
		size--;
	}
	return des;
}

//模拟实现memmove
void *my_memmove(void *des, const void *src, int size)
{
	assert(des);
	assert(src);
	char *des_ch = (char *)des;
	unsigned char * src_ch = (unsigned char *)src;
	if (des_ch <= src_ch || des_ch >= src_ch + size){//类型完整才能进行指针运算
		//从前往后拷贝的情况
		while (size--){
			*des_ch = *src_ch;
			des_ch++, src_ch++;
		}
	}
	else{
		//从后往前拷贝的情况
		des_ch = des_ch + size - 1;
		src_ch = src_ch + size - 1;
		while (size--){
			*des_ch = *src_ch;
			des_ch++, src_ch++;
		}
	}
	return des;
}

int main()
{
	char src[10] = "qweasdz";
	int size = strlen(src) + 1;
	char des[20];

	//printf("%s\n", my_memcpy(des, src, size));//打印结果:qweasdz
	//printf("%s\n", my_memcpy(src, src + 1, size));//打印结果:weasdz
	//printf("%s\n", my_memcpy(src + 1, src, size));//打印结果:qqqqqqqq

	//printf("%s\n", my_memmove(des, src, size));//打印结果:qweasdz
	//printf("%s\n", my_memmove(src, src + 1, size));//打印结果:weasdz
	//printf("%s\n", my_memmove(src + 1, src, size));//打印结果:weasdz

	system("pause");
	return 0;
}

于实现memmove函数考虑的内存重叠问题
4、代码测试memmove、memcpy函数
memmove函数:有考虑内存重叠问题
	char src[10] = "qweasdz";
	int size = strlen(src) + 1;
	char des[20];
	//printf("%s\n", memmove(src + 1, src, size));//打印结果:qweasdz//说明:返回拷贝的值
	//memmove(des, src, size);
	//printf("%s\n", src);//打印结果:qweasdz

	//memmove(src, src + 1, size);
	//printf("%s\n", src);//打印结果:weasdz

	memmove(src + 1, src, size);//第五种情况
	printf("%s\n", src);//结果为:qqweasdz
memcpy函数:测试显示memcpy函数也考虑了内存重叠问题
	char src[10] = "qweasdz";
	int size = strlen(src) + 1;
	char des[20];

	//memcpy(des, src, size);
	//printf("%s\n", src);//打印结果:qweasdz

	//memcpy(src, src + 1, size);
	//printf("%s\n", src);//打印结果:weasdz

	memcpy(src + 1, src, size);//第5种情况
	printf("%s\n", src);//结果为:qqweasdz
5、使用c函数时,需要考虑内存重叠问题,还是去使用memmove函数。

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/80337914