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

C语言内存函数详解

文章目录

  • 前言
  • 一、memcpy函数(内存拷贝函数)
  • 二、memmove重叠拷贝函数
  • 三.memset内存设置函数
  • 四.memcmp内存比较函数
  • 总结

前言

我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数,接下来我们就学习一下关于内存相关的一些函数。


一.memcpy函数(内存拷贝函数)

void * memcpy ( void * destination, const void * source, size_t num );

1.1使用

destination这个是目地,source这个是源头,size_t num这个是内存大小的字节单位

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 0 };memcpy(arr2, arr1, 20);return 0;
}

负责拷贝两块独立空间中的数据

如果你想要重叠拷贝的话,则请使用memmove

1.2模拟实现

void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest = *(char*)src;dest=*(char*)dest + 1;src=*(char*)src + 1;}return ret;}

代码写完很多人会有疑问,为什么要这样子去做?char为什么要这样子的指针去强制类型转换,是因为这个代码,它可以用于任意类型的内存数据所以说他其实并不知道你传进来的数据是哪种类型的,我们之前的例子是一个整形,你不能用一个整形去做,他万一是长整形短整型怎么办呢?所以我们要想到一个能解决所有类型的方法,那就是把它强制转换成字符新的指针,因为一个字符类型,他就等于一个字节,所以说你每+1就等于一个字节,每不管哪个类型都可以把它变成一个字节一个字节的走。

把这个数据类型,都可以分成这样,所以就解决了。

二.memmove重叠拷贝函数

void * memmove ( void * destination, const void * source, size_t num );

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。

2.1使用

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

2.2模拟实现

这个的模拟实现就比较难了,有时候需要从前往后处理,有时候又需要从后往前处理,所以我们必须来画一个图来思考

当dest的地址小于src的地址,我们是从前往后拷还是从后往前拷呢?我们可以从图像得出,如果我们从后往前拷的话就会覆盖还未考虑的数据,所以只能从前往后拷。

同理,当dest的地址大于src的时候,只能从后往前拷

void* my_memmove(void* dest, const void* src, size_t num)
{//assert(dest && src);//从前向后拷贝void* ret = dest;if (dest < src){while (num--){*(char*)src = *(char*)dest;dest = *(char*)dest + 1;src=*(char*)src + 1;}}//从后向前拷贝else{while (num--){//先找到最后一个数据,通过num--不断向前拷贝*((char*)dest+num) = *((char*)src+num);}}return ret;}

三.memset内存设置函数

void * memset ( void * ptr, int value, size_t num );

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容

使用

int main()
{char str[] = "hello world";memset(str, 'x', 6);printf(str);return 0;
}

四.memcmp内存比较函数

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

是按字节数去比较,如果在之前就比完了,后面就不需要再比了,如果源头大于目的返回一个小于0的数

int main()
{int arr1[] = { 1,2,3,4 };int arr2[] = { 1,2,3,5 };int ret = memcmp(arr1, arr2, 15);printf("%d", ret);return 0;
}

返回-1


总结

熟练的掌握这一系列的库函数,可以在做某些题目上省去大量的时间,如果你不做题目,掌握这些函数,也可以增加你阅读别人函数的经验看得懂别人的代码

相关文章:

  • 停车场车辆统计C卷(JavaPythonC++Node.jsC语言)
  • 如何关闭 Visual Studio 双击异常高亮
  • 基于高德地图JS API实现Vue地图选点组件
  • JavaSE-----认识异常【详解】
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Tabs)
  • 【ArcGISPro】道路数据下载并使用
  • 系统设计学习(四)海量数据
  • UGUI Text 重写Spacing字体间距
  • 面试经典-24-加油站
  • 【Linux】Shell编程【二】
  • JDK21虚拟线程缺陷总结
  • 某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞复现
  • 移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展
  • python爬虫实战——小红书
  • Linux学习——线程池的创建
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • django开发-定时任务的使用
  • JavaScript设计模式与开发实践系列之策略模式
  • laravel 用artisan创建自己的模板
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vuex 笔记整理
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 工程优化暨babel升级小记
  • 关于extract.autodesk.io的一些说明
  • 如何胜任知名企业的商业数据分析师?
  • 实习面试笔记
  • 小程序开发之路(一)
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @Autowired自动装配
  • [.net] 如何在mail的加入正文显示图片
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [Godot] 3D拾取
  • [HUBUCTF 2022 新生赛]
  • [IE技巧] IE8中HTTP连接数目的变化
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [LeetCode] 197. 上升的温度
  • [linux] Key is stored in legacy trusted.gpg keyring
  • [Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4
  • [STM32F407ZET6] GPIO
  • [Windows编程] 监视DLL装载/卸载
  • [ZT] 浙江大学校长杨卫院士:研究生导师“十戒”
  • [编程技巧] C++中优化BOOL 变量的声明
  • [第五组E]用例:活动浏览+功能说明书+技术说明书
  • [共享WIFI]将笔记本网络设置为共享WIFI
  • [架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP