news 2026/2/9 0:09:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 13:53:48

无线网络仿真:6G网络仿真_(19).6G网络仿真未来趋势

6G网络仿真未来趋势 1. 6G网络仿真概述 6G网络仿真是在6G网络研究和开发中不可或缺的一部分。通过仿真&#xff0c;研究人员可以验证理论模型、评估网络性能、测试新算法和技术&#xff0c;以及预测未来网络的行为。6G网络仿真不仅涵盖了传统的无线通信仿真技术&#xff0c;还引…

作者头像 李华
网站建设 2026/2/4 16:11:18

【单仓库多旅行商问题SDMTSP】基于BSLO吸血水蛭优化器求解单仓库多旅行商问题,可以更改数据集和起点附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/2/5 8:42:18

强烈安利9个AI论文网站,MBA论文写作必备!

强烈安利9个AI论文网站&#xff0c;MBA论文写作必备&#xff01; AI 工具如何助力 MBA 论文写作 MBA 学习过程中&#xff0c;论文写作是一项不可避免的挑战。无论是选题、资料收集还是内容撰写&#xff0c;都需要大量的时间和精力。而随着 AI 技术的发展&#xff0c;越来越多的…

作者头像 李华
网站建设 2026/2/4 13:08:49

大模型高薪岗位汇总:年薪40-220万,程序员必学必收藏

锐仕方达发布热招高薪岗位132个&#xff0c;最高年薪400万。大模型领域薪资诱人&#xff0c;9个精选岗位年薪从40万到220万不等&#xff0c;涵盖杭州、上海、北京等热门城市&#xff0c;涉及互联网、人工智能、航空航天等行业。这些高薪岗位包括大模型研发经理、算法工程师、技…

作者头像 李华
网站建设 2026/2/4 10:24:09

大模型时代职场指南:收藏这份全景职业图谱,找准你的发展赛道

本文将大模型领域岗位划分为基础设施与工程类、模型研发与算法类、数据类、产品与应用类四大类&#xff0c;详细列举了每类典型岗位及职责。文章指出岗位间存在交叉&#xff0c;未来可能出现新角色&#xff0c;并强调除专业技能外&#xff0c;沟通协作、产品思维和伦理意识日益…

作者头像 李华
网站建设 2026/2/8 8:02:18

突破传统训练局限!TRAPO框架实现大模型“边学边练“新范式

TRAPO框架解决了传统"先SFT后RL"两阶段训练的不一致性问题&#xff0c;通过实例级交错执行监督微调与强化学习实现"边学边练"协同范式。其创新"按需支架"机制和信任区域SFT(TrSFT)目标函数&#xff0c;通过梯度裁剪避免策略退化&#xff0c;使模…

作者头像 李华