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

C语言内存函数:介绍使用及其模拟实现

memcpy - 内存拷贝

void*memcpy(void*destination,constvoid*source,size_t num);
  • 从source位置开始向后复制num个字节到destination指向的内存位置
  • 不会在遇到’\0’时停下来
  • 如果source和destination有重叠,复制结果是未定义的
  • 适用于非重叠内存区域的拷贝

使用示例

#include<stdio.h>#include<string.h>intmain(){intarr1[]={1,2,3,4,5,6,7,8,9,10};intarr2[10]={0};memcpy(arr2,arr1,20);// 拷贝20个字节(5个int)for(inti=0;i<10;i++){printf("%d ",arr2[i]);}// 输出: 1 2 3 4 5 0 0 0 0 0return0;}

模拟实现

void*memcpy(void*dst,constvoid*src,size_t count){void*ret=dst;assert(dst);assert(src);/* copy from lower addresses to higher addresses */while(count--){*(char*)dst=*(char*)src;dst=(char*)dst+1;src=(char*)src+1;}returnret;}

memmove - 可处理重叠的内存拷贝

void*memmove(void*destination,constvoid*source,size_t num);
  • 与memcpy功能类似,但可以处理源内存块和目标内存块重叠的情况
  • 如果源空间和目标空间出现重叠,必须使用memmove函数

使用示例

#include<stdio.h>#include<string.h>intmain(){intarr1[]={1,2,3,4,5,6,7,8,9,10};memmove(arr1+2,arr1,20);// 将前5个元素拷贝到从第3个元素开始的位置for(inti=0;i<10;i++){printf("%d ",arr1[i]);}// 输出: 1 2 1 2 3 4 5 8 9 10return0;}

模拟实现

void*memmove(void*dst,constvoid*src,size_t count){void*ret=dst;if(dst<=src||(char*)dst>=((char*)src+count)){/* Non-Overlapping Buffers - 从低地址向高地址拷贝 */while(count--){*(char*)dst=*(char*)src;dst=(char*)dst+1;src=(char*)src+1;}}else{/* Overlapping Buffers - 从高地址向低地址拷贝 */dst=(char*)dst+count-1;src=(char*)src+count-1;while(count--){*(char*)dst=*(char*)src;dst=(char*)dst-1;src=(char*)src-1;}}returnret;}

memset - 内存设置

void*memset(void*ptr,intvalue,size_t num);
  • 将内存中的值以字节为单位设置成指定内容
  • 常用于初始化内存区域或清空数组

使用示例

#include<stdio.h>#include<string.h>intmain(){charstr[]="hello world";memset(str,'x',6);// 将前6个字节设置为'x'printf("%s\n",str);// 输出: xxxxxxworld// 也可以用于初始化数组intarr[10];memset(arr,0,sizeof(arr));// 将整个数组初始化为0return0;}

memcmp - 内存比较

intmemcmp(constvoid*ptr1,constvoid*ptr2,size_t num);
  • 比较从ptr1和ptr2指针开始向后的num个字节
  • 无符号字符的方式逐字节比较
返回值含义
<0第一个不匹配的字节在prt1中的值小于prt2中的值
=0两个内存块的内容相等
>0第一个不匹配的字节在prt1中的值大于prt2中的值

使用示例

#include<stdio.h>#include<string.h>intmain(){charbuffer1[]="DWgaOtP12df0";charbuffer2[]="DWGAOTP12DF0";intn;n=memcmp(buffer1,buffer2,sizeof(buffer1));if(n>0)printf("'%s' is greater than '%s'.\n",buffer1,buffer2);elseif(n<0)printf("'%s' is less than '%s'.\n",buffer1,buffer2);elseprintf("'%s' is the same as '%s'.\n",buffer1,buffer2);return0;}
http://www.jsqmd.com/news/249880/

相关文章:

  • 技术资产管理:智能复用评估
  • 【计算机毕业设计案例】基于SpringBoot的大学生综合素质测评系统设计与实现基于SpringBoot的学生身体素质测评管理系统(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于SpringBoot的水族馆鱼类商品销售与经营管理系统基于SpringBoot的水族馆商品销售与经营管理系统(程序+文档+讲解+定制)
  • 无线网络仿真:6G网络仿真_(19).6G网络仿真未来趋势
  • 无线网络仿真:6G网络仿真_(20).6G网络仿真实践项目
  • 智能编程平台:低代码开发实践
  • 无线网络仿真:Wi-Fi网络仿真_(3).仿真软件介绍与使用
  • 无线网络仿真:6G网络仿真_(15).6G网络仿真参数设置
  • 大数据浪潮下,ClickHouse的破局之道
  • 大数据建模中的向量化处理:SIMD指令优化计算
  • 别再重复造轮子!AI应用架构师:企业AI中台可复用组件库建设,附开发规范
  • 这3个内幕曝光,了解洁净室专用电话机的技术内核!
  • 【毕业设计】基于Java的学生身体素质测评管理系统基于SpringBoot的学生身体素质测评管理系统(源码+文档+远程调试,全bao定制等)
  • 计算机毕设 java 基于协同过滤算法的就业推荐系统的设计与实现 基于协同过滤算法的智能就业推荐平台 求职与企业招聘匹配系统
  • 计算机毕设 java 基于智能机器人的智能答疑系统的设计与实现 基于智能机器人的交互式答疑平台 师生问答与知识交流系统
  • 【单相STATCOM】单相STATCOM在单相系统中补偿无功功率,并减轻谐波附Simulink仿真
  • Unity3D 绿色家园 垃圾分类
  • 【信号处理】通过 “最近邻匹配” 和 “球面线性插值(SLERP)” 两种方式将 GNSS 位姿(位置 + 四元数)插值到激光雷达时间戳附Matlab代码
  • 必学!提示工程领域认证及进阶的要点全解析
  • 【单悬臂梁】基于梯度缺陷ANCF梁单元的单悬臂梁在重力作用下的弯曲MATLAB仿真,采用显式时间步进算法研究附Matlab代码
  • Java毕设选题推荐:基于SpringBoot+vue的学生身体素质体质测评管理系统基于SpringBoot的学生身体素质测评管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 不想让孩子近视度数加深,这些知识点越早知道越好!
  • 计算机Java毕设实战-基于vue的学校学生身体素质测评管理系统基于SpringBoot的学生身体素质测评管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 孩子近视常会伴有这些小动作,你都知道吗?
  • 【低PAPR、低延迟、高谱效率】一种新型调制方案,结合了滤波器组多载波(FBMC)偏移正交幅度调制(OQAM)和单载波频分多址(SC-FDMA)的优势研究附Matlab代码
  • 《P1297 [国家集训队] 单选错位》
  • 【文献分享】MedMPT一种用于多种临床呼吸系统疾病应用的视觉语言预训练转换器
  • Java毕设项目:基于SpringBoot的学生身体素质测评管理系统(源码+文档,讲解、调试运行,定制等)
  • 【低压配电网】【对单相接地低压电网监测方案性能】在径向低压测试馈线上使用WLS状态估计器的性能,由于测量误差的随机性质,分析以蒙特卡洛方式进行附Matlab代码
  • LabVIEW硬刚AB PLC的底层通讯玩法