纯是干货,这些C语言内存函数你都了解吗?

发布于:2022-12-19 ⋅ 阅读:(491) ⋅ 点赞:(0)


这期给大家博主给大家介绍一下C语言都有那些内存函数,干货满满哦,一定要耐心看完。

一、memcpy()函数

1、memcpy的介绍及使用

memcpy()函数是C/C++使用的内存拷贝库函数,既然是库函数,我们先来了解一下它的功能以及参数吧
在这里插入图片描述
在这里插入图片描述
由以上我们可以知道memcpy()一共有三个参数,返回值是void*

(a)viod* destination —— 拷贝的目标内存地址
(b)const void* source —— 拷贝的原始内存地址
(c)size_t num —— 拷贝的字节数 

下面我们来看看它的使用,废话不多说,直接上代码

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10];
	//现在我们要将arr1中的前半部分拷贝到arr2中,使用memcpy
	memcpy(arr2, arr1, sizeof(arr1) / 2);//拷贝20个字节
	printf("拷贝后:\n");
	for (int i = 0; i < sizeof(arr1) / (2 * sizeof(int)); i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

2、模拟实现memcpy()函数

//模拟实现memcpy()函数
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* p = dest;
	while (num--)
	{
		*((char*)dest) = *((char*)src);
		(char*)dest = (char*)dest + 1;
		(char*)src = (char*)src + 1;
	}
	return p;
}
int main()
{
	char str1[] = "hello world!";
	char str2[10] = "xxxxxxxxx";
	//把hello拷贝到str2中
	my_memcpy(str2, str1, 5);
	printf("%s\n", str2);
	return 0;
}

二、memmove()函数

1、memmove的介绍及使用

下面我们来看看memmove()函数的参数及返回值
在这里插入图片描述
在这里插入图片描述

注意:
1.咋这一看参数和返回值与memcpy一模一样呢,是的,他们参数一样,有什么区别呢,请耐心看完文章。
2.memmove()函数也是C语言库函数中的拷贝函数,但是它拷贝的是同一个数据中的内容

下面来看看它如何使用,上代码

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//这里我们想把1 2 3 4 5 拷贝到3 4 5 6 7的位置
	memmove(arr + 2, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

2、模拟实现memmove()函数

//模拟实现memmove()函数
void* my_memmove(void* dest, const void* src, size_t num)
{
	//断言,防止传入空指针
	assert(dest && src);
	void* p = dest;//记录起始地址
	//目的地址比拷贝原始地址小时,从左往右拷贝
	//这样可以保证拷贝时把数据给覆盖掉
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			(char*)dest = (char*)dest + 1;
			(char*)src = (char*)src + 1;
		}
	}
	else //反之从右往左拷贝
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return p;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

三、总结

memcpy()与memmove()的区别

memcpy()与memmove()都是库函数中的拷贝函数
但是memcpy是从另一个数组拷贝另一个
而memmove是在同一个数组中进行操作的
这里注意的是:有些编辑器在实现memcpy的时候把它完美实现了,既能在不同数组中操作,也能在同一个数组中操作,这里小编建议在使用的时候还是把它们区别开来比较好

在这里插入图片描述
结语:

每个人的成长和进步都离不开点点滴滴的积累,如果小编的内容对您有所帮助,希望友友们三连加关注哦,你的支持是小编创作的最大动力。

本文含有隐藏内容,请 开通VIP 后查看