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

【C语言】C语言内存函数

👑个人主页:啊Q闻       

🎇收录专栏:《C语言》           

 🎉道阻且长,行则将至

前言 

这篇博客是关于C语言内存函数(memcpy,memmove,memset,memcmp)的使用以及部分的模拟实现

 memcpy,memmove,memset,memcmp的头文件都为string.h

一.memcpy使用及模拟实现 

1.使用

 注1:使用void*的原因:拷贝的数据可能为结构体,字符等其他类型数据。

 注2:函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内   存位置中

  注3:这个函数在遇到'\0'时不会停下来。

  注4:memcpy是用于不重叠的数组之间的拷贝

 代码运行:

也可以从数组中间元素开始拷贝:

 2.模拟实现

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	while (num--)
	{
		*(char*)dest = *(char*)src;//void*要强制性转化成其他类型才可以计算
		dest = (char*)dest+1;
		src = (char*)src + 1;//强制性转化只是暂时的,所以加一时也要进行强制转换
	}
	return ret;
}

二.memmove的使用及模拟实现

1.使用 

注1:memmove和memcpy的差别就是memmove函数处理的源内存块和目的内存块是可以重叠的 

运行过程: 

在arr1+3处即元素4的前面开始插入源内存块,将arr1中的3个元素拷贝到arr1中,结果如下:

 

2.模拟实现 

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	if (dest <= src )//c从前向后拷贝
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest=(char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else//从后向前拷贝
	{
		dest = (char*)dest + num - 1;//找到空间末位置
		src = (char*)src + num-1;//找到空间末位置
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest -1;
			src = (char*)src -1;
		}
	}
	return ret;
}

详解:

当dest于src两个空间不重叠时,从前向后拷贝或是从后向前拷贝都可以。

三.memset的使用

 

memset函数是用于设置内存的,其单位为字节 

运行过程:

 

四.memcmp的使用 

 比较从ptr1ptr2指向的位置开始,向后的num个字节,单位是字节

返回值为:

 运行过程:

文章到这里就结束了,感谢阅读,如果对你有帮助的话,给个三连支持一下吧 


http://www.kler.cn/a/273996.html

相关文章:

  • 使用 Try-With-Resources 简化资源管理
  • halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
  • C++多态(八股总结)
  • 【GUI-pyqt5】QWidget类
  • windows11(或centos7)安装nvidia显卡驱动、CUDA、cuDNN
  • 以太网ICMP协议(ping指令)——FPGA学习笔记25
  • 防火墙的原理和配置
  • 《计算机视觉中的深度学习》之目标检测算法原理
  • JAVA八股day1
  • Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners
  • 手机备忘录怎么导出到电脑,如何将手机备忘录导出到电脑
  • 性能测试-Jmeter常用元件基础使用
  • 【每日一问】手机如何开启USB调试?
  • elment-ui el-tabs组件 每次点击后 created方法都会执行2次
  • 【四 (4)数据可视化之 Ploty Express常用图表及代码实现 】
  • 数据库中DQL、DML、DDL、DCL的概念与区别
  • LightDB24.1 Sequence支持设置minvalue小于INT64_MIN
  • 生成式人工智能如何改变商业和社会
  • layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】
  • html5播放flv视频
  • 微服务原理和实践
  • 如何使用vue插件Konva实现图片的缩放
  • 【代码随想录Day27】
  • 网页429:请求过多
  • 探索未来科技:量子计算的前沿与挑战
  • ET框架新起一个服务及实现服务之间的消息通讯