当前位置: 首页 > news >正文

c语言学习16——内存函数

内存函数

  • 一、memcpy使用和模拟实现
    • 1.1参数
    • 1.2 使用
    • 1.3 模拟实现
  • 二、memmove使用和模拟实现
    • 2.1 参数
    • 2.2 使用
    • 2.3 模拟实现
  • 三、memset使用
    • 3.1 参数
    • 3.2 使用
  • 四、memcmp使用
    • 4.1 参数
    • 4.2 使用

一、memcpy使用和模拟实现

1.1参数

在这里插入图片描述

  • 因为内存中不知道存的是什么类型的地址,所以函数的参数以及返回值都是void类型。
  • 第一个参数是要拷贝到哪;第二个参数是从哪里拷贝;第三个参数是要拷贝的数据长度。
  • 该函数不会检查是否有终止字符‘\0’,它会准确地复制num长度的数据。
  • 为了避免溢出,destination和source的长度应至少为num。
  • destination和source不能有重叠。

1.2 使用

在这里插入图片描述

1.3 模拟实现

void my_memcpy(void* arr2, void* arr1, size_t num)
{
	while (num--)
	{
		*(char*)arr2 = *(char*)arr1;
		((char*)arr2)++;
		((char*)arr1)++;
	}
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6 };
	int arr2[2];
	my_memcpy(arr2, arr1, 8);
	int i = 0;
	for (i = 0;i < 2;i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}

在这里插入图片描述
在模拟实现时,重点是对数据的拷贝,因为内存中存放的数据不知道其类型,因此我们把数据分成最小的单元也就是1个字节,对应char类型数据,因此将void类型强制转换成char类型的数据,然后通过while循环,遍历num个字节长度的数据,实现一定量数据的拷贝。

二、memmove使用和模拟实现

2.1 参数

在这里插入图片描述

  • 注意:memmove和memcpy的区别就是,memmove所指向的两块空间可以有重叠。

2.2 使用

在这里插入图片描述

2.3 模拟实现

//展示其中一种特例
#include <assert.h>

void my_memmove(void* arr2, void* arr1, size_t num)
{
	assert(arr1 && arr2);
	if (arr1 <= arr2)
	{
		while (num--)
		{
			*((char*)arr2 + num) = *((char*)arr1 + num);
		}
	}
	else
	{
		while (num--)
		{
			*((char*)arr2) = *((char*)arr1);
			((char*)arr2)++;
			((char*)arr1)++;
		}
	}
}


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

	return 0;
}
}

在这里插入图片描述

  • 注意:在进行memmove的模拟实现时,应考虑重叠的情况,例如对一个字符串进行调整时,可能会出现:source地址分别>、<、=destination地址的情况,因此需要分情况来讨论。

三、memset使用

3.1 参数

在这里插入图片描述

  • 参数一是一个指向所要修改的内存的地址;参数二是要修改成什么数值;参数三是修改几个字节个长度的数据。

3.2 使用

在这里插入图片描述

四、memcmp使用

4.1 参数

在这里插入图片描述

  • 参数一和参数二是要比较的两个数据的地址;参数三是要比较的数据的长度。
  • 内存1>内存2,打印一个大于0的数字;内存1<内存2,打印一个小于0的数字;内存1=内存2,打印0。

4.2 使用

在这里插入图片描述
比较的是12个字节,也就是前三个数字的大小,数组2的前三个数字比数组1前三个数字大,所以打印小于0的数字,-1。

http://www.dtcms.com/a/111844.html

相关文章:

  • 面向对象(2)
  • 多模态技术概述(一)
  • Visio | 将(.vsdx)导出为更清楚/高质量的图片(.png) | 在Word里面的visio图
  • 从感光sensor到显示屏,SOC并非唯一多样
  • 手动将ModelScope的模型下载到本地
  • Eclipse怎么创建java项目
  • 前端快速入门学习2-HTML
  • 编写实现一个简易的域名服务器
  • 长龙通信机CAN数据查看(工具版)
  • AI Agent设计模式一:Chain
  • 出现次数最多的子树元素和——深度优先搜索
  • 如何将Android 应用上传到国内各大应用市场
  • Webpack中loader的作用。
  • 【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用
  • AI+OCR:解锁数字化新视界
  • 33、web前端开发之JavaScript(二)
  • KingbaseES之KDts迁移Mysql
  • 【11408学习记录】英语写作黄金模板+语法全解:用FTC数据泄漏案掌握书信结构与长难句拆解(附思维导图)
  • 【统计方法】LASSO筛变量
  • 循环引用问题和专门用来解决的weak_ptr
  • 第二十八章:Python可视化图表扩展-和弦图、旭日图、六边形箱图、桑基图和主题流图
  • 算法设计学习8
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.3前沿方向:MoE架构、世界模型与具身智能
  • html5炫酷3D文字效果项目开发实践
  • Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南
  • 泰博云平台solr接口存在SSRF漏洞
  • Docker安装、配置Mysql5.7
  • hackmyvm-Principle
  • Java 大视界 -- 基于 Java 的大数据机器学习模型在图像识别中的迁移学习与模型优化(173)
  • 软路由安装指南