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

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

C语言——内存函数详解
  • 一、memcpy()函数
    • 1、memcpy的介绍及使用
    • 2、模拟实现memcpy()函数
  • 二、memmove()函数
    • 1、memmove的介绍及使用
    • 2、模拟实现memmove()函数
  • 三、总结

这期给大家博主给大家介绍一下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的时候把它完美实现了,既能在不同数组中 *** 作,也能在同一个数组中 *** 作,这里小编建议在使用的时候还是把它们区别开来比较好


结语:

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2889239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存