memcpy和memmove的模拟实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41548145/article/details/102758497

memmove长度受限制的可以重叠的复制

void *my_memmove(void * dst, const void *src, size_t num)
{
	void *start = src;

	if (dst <= src || (char *)dst >= ((char *)src + num))//前覆盖或者没有覆盖 ,从前往后覆盖
	{
		while (num--)
		{
			*(char*)dst = *(char*)src;

			((char *)dst)++;
			((char *)src)++;
		}
	}
	else//后覆盖,从后往前复制
	{
		dst = (char *)dst + num - 1;
		src = (char *)src + num - 1;
		while (num--)
		{
			*(char*)dst = *(char*)src;

			dst = (char *)dst - 1;
			src = (char *)src - 1;

		}
	}
	return start;
}

int main()
{
	int src[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	my_memmove(src+3, src, 16);
	for (int i = 0; i < 8; i++)
	{
		printf("%d", src[i]);
	}
}

memcpy长度有限的字节拷贝遇到’\0’不会停止,从src后复制num个字节的数据给dst,如果src和dst有任何的重叠,复制的结果是未定义的

void *my_memcpy(void* dst, const void* src, size_t num)
{
	void *start = dst;
	//*((char*)(dst)+num) = '\0';
	while (num--)
	{
		*(char *)dst = *(char *)src;
		((char*)dst)++;
		((char*)src)++;

	}

	return (start);
}
int main()
{
	char src[] = { 1, 2, 3, 4, 5, 6 };

	char dst[20] = { 0 };

	my_memcpy(dst,src+2, 16);
	for (int i = 0; i < 4; i++)
	{
		printf("%d", dst[i]);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41548145/article/details/102758497