超详细讲解内存函数(保姆级教程!!!)

本文详细介绍了C/C++中常用的内存操作函数,包括memcpy, memmove, memset, memcmp和memchr。讲解了它们的功能、使用方法及注意事项,并通过示例代码展示了函数的模拟实现。特别强调了memcpy和memmove在处理内存重叠时的区别,以及在实际应用中的选择策略。" 129306009,14771266,配置Airbyte的外部Postgres数据库,"['数据仓库', '大数据', '数据集成']
摘要由CSDN通过智能技术生成

内存操作函数函数

memcpy函数

在这里插入图片描述
即从存储区 src 复制 num 个字节到存储区 dest,
dest – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
src – 指向要复制的数据源,类型强制转换为 void* 指针。
num – 要被复制的字节数。

memcpy函数的使用

大家看下面这一段代码:

// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>
 
int main ()
{
   
   const char src[50] = "http://www.runoob.com";
   char dest[50];
   memcpy(dest, src, strlen(src)+1);
   printf("dest = %s\n", dest);
   return(0);
}

编译并运行上面的程序后可以得到输出的结果为
dest = http://www.runoob.com。
不仅如此,memcpy函数还可以完成对自身内容的拷贝:

int main()
{
   
	int arr1[] = {
    1,2,3,4,5,6,7,8,9,10 };
	//int num = 0;
	//scanf("%d", num);
	memcpy(arr1 + 2, arr1, 20);
	for (int i = 0;i < 10;i++)
	{
   
		printf("%d ", arr1[i]);
	}
}

上述代码表示了memcpy函数相当于将“12345”的内容拷贝到“34567”中,但运行程序后,我们会发现事实并非如此。

在这里插入图片描述

我们会发现,内容似乎并没有被很好地替换成功,反而出现了一些问题,而这也正是memcpy函数具有缺陷的地方,memcpy函数具有以下几个特点:

1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2、这个函数在遇到 ‘\0’ 的时候并不会停下来。
3、如果source和destination有任何的重叠,复制的结果都是未定义的。

因此,memcpy函数在拷贝自身的时候,当dest与src有任何的重叠,都会发生拷贝的失败,而这又是为什么呢?
遵循上面的代码,假如我们要将12345拷贝到34567中,那么:
在这里插入图片描述
既然如此,我们该如何解决这个问题呢?其实很简单。
我们可以进行逆向思维,如果从前往后进行拷贝替换行不通,那么我们可以从后往前进行拷贝替换。这样的话5替换7、4替换6,3替换5…我们便可以惊奇的发现,这样子替换成功了,不会出现拷贝的内容被替换的情况。
于是许多小伙伴明白了,以后拷贝替换就从后往前进行就好了,可事实真是如此吗?大家看下面一张图:
在这里插入图片描述
这时候如果我们按照从最后一个开始置换,即从后往前进行置换,又会出现相同的问题。
在这里插入图片描述

这是因为同第一种情况一样,当7拷贝到5,6拷贝到4时,发现将要拷贝的内容已经被替换掉了,而这个时候从第一个即从前往后进行拷贝才能成功。
那么,我们可以发现一个规律:

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值