C语言一些操作空间的库函数

文章介绍了memcpy函数的作用,用于在内存中复制一段数据到另一段空间,同时对比了strcpy的差异。文中提供了memcpy的自定义实现,并指出在源和目标空间重叠时可能出现的问题。为了解决这个问题,文章提到了memmove函数,它能在空间重叠时确保安全复制,并给出了memmove的简单实现。
摘要由CSDN通过智能技术生成

memcpy函数

memcpy函数的作用是将一段空间内的内容复制到另一段空间内。

函数原型:void *memcpy(void *p1, void *p2, unsigned size);

返回值是新空间的地址,第一个参数是指向用于存储复制内容的目标数组,第二个参数指向要复制的数据源,第三个参数是要复制的字节数。

strcpy只能复制字符串,memcpy可以复制任意类型数据。

使用方法和strcpy函数差不多。使用起来并不难

我们可以来看看这个函数的实现

#include <stdio.h>
void* My_memcpy(void* p1, const void* p2, size_t n)
{
	void* tem = p1;
	while (n--)
	{
		*(char*)p1 = *(char*)p2;
		p1 = (char*)p1 + 1;
		p2 = (char*)p2 + 1;
	}
	return tem;
}
int main()
{
	char arr[20] = { 0 };
	char arr1[] = "hello world";
	My_memcpy(arr, arr1, sizeof(arr1));
	printf("%s\n", arr);
	printf("%s\n", (char*)My_memcpy(arr, arr1, sizeof(arr1)));
	return 0;
}

 实现起来并不难,和之前qsort函数的实现有点相同。主要是在设计时要将参数的类型进行强制类型转换。思想和qsort函数设计的一样,不懂可以看看之前的qsotr函数的文章

memcpy函数在当起始空间和目的地空间重叠时并不能保证复制过程不被干扰。

可以使用memmove函数来代替使用。这个函数能保证在空间重叠时,复制过程不会被干扰。

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

使用方法和memcpy一样。可以看看memmove的实现方法

#include <stdio.h>
void* My_memmove(const void* p1, const void* p2, size_t num)
{
	void* s1 = p1;
	void* s2 = p2;
	if (p1>p2)
	{
		while (num--)
		{
			p1 = (char*)s1 + num;
			p2 = (char*)s2 + num;
			*((char*)p1) = *((char*)p2);


		}
	}
	else
	{
		while (num--)
		{
			*((char*)p1) = *((char*)p2);
			p1 = (char*)p1 + 1;
			p2 = (char*)p2 + 1;
		}
	}
	return s1;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	char arr[] = "abcdefghijk";
	My_memmove(arr1 + 3, arr1, 20);
	My_memmove(arr + 3, arr, 5);
	printf("%s\n", arr);
	for (int i = 0; i < 15; i++)
	{
		printf("%d ", arr1[i]);
	}
	
	return 0;
}

主要是将复制方法分成两个部分。

比较两个地址的大小,当起始空间大于目的空间时,我们采取从后向前复制,防止再复制时其实空间后面的内容被覆盖,从而改变复制结果。当小于时,则采取从前向后复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值