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

C语言从入门到进阶——第18讲:内存函数

文章目录

  • 1. memcpy
  • 2. memmove
  • 3. memset
  • 4. memcmp

1. memcpy

函数原型

void*memcpy(void*destination,constvoid*source,size_tnum);

功能

  • memcpy是完成内存块拷贝的,不关注内存中存放的数据是啥
  • 函数memcpysource的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 如果sourcedestination有任何的重叠,复制的结果都是未定义的。
    • 内存重叠的情况使用memmove就行
  • memcpy的使用需要包含<string.h>

参数

  • destination:指针,指向目标空间,拷贝的数据存放在这里
  • source:指针,指向源空间,要拷贝的数据从这里来
  • num:要拷贝的数据占据的字节数

返回值
拷贝完成后,返回目标空间的起始地址

代码演示

#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);inti=0;for(i=0;i<10;i++){printf("%d ",arr2[i]);}return0;}

模拟实现

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

2. memmove

函数原型

void*memmove(void*destination,constvoid*source,size_tnum);

功能

  • memmove函数也是完成内存块拷贝的
  • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • memmove的使用需要包含<string.h>

参数

  • destination:指针,指向目标空间,拷贝的数据存放在这里
  • source:指针,指向源空间,要拷贝的数据从这里来
  • num:要拷贝的数据占据的字节数

返回值
拷贝完成后,返回目标空间的起始地址

代码演示

#include<stdio.h>#include<string.h>intmain(){intarr1[]={1,2,3,4,5,6,7,8,9,10};memmove(arr1+2,arr1,20);inti=0;for(i=0;i<10;i++){printf("%d ",arr1[i]);}return0;}

输出的结果

1 1 2 3 4 5 6 7 8 9 10

模拟实现

void*memmove(void*dst,constvoid*src,size_tcount){void*ret=dst;if(dst<=src||(char*)dst>=((char*)src+count)){// Non-Overlapping Buffers// copy from lower addresses to higher addresseswhile(count--){*(char*)dst=*(char*)src;dst=(char*)dst+1;src=(char*)src+1;}}else{// Overlapping Buffers// copy from higher addresses to lower addressesdst=(char*)dst+count-1;src=(char*)src+count-1;while(count--){*(char*)dst=*(char*)src;dst=(char*)dst-1;src=(char*)src-1;}}return(ret);}

3. memset

函数原型

void*memset(void*ptr,intvalue,size_tnum);

功能

  • memset函数是用来设置内存块的内容的,将内存中指定长度的空间设置为特定的内容。
  • memset的使用需要包含<string.h>

参数

  • ptr:指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
  • value:要设置的值,函数将会把value值转换成unsigned char的数据进行设置的。也就是以字节为单位来设置内存块的。
  • num:要设置的内存长度,单位是字节。

返回值
返回的是要设置的内存空间的起始地址。

代码演示

#include<stdio.h>#include<string.h>intmain(){charstr[]="hello world";memset(str,'x',6);printf(str);return0;}

输出的结果

xxxxxxworld

总结
当有一块内存空间需要设置内容的时候,就可以使用memset函数,值得注意的是memset函数对内存单元的设置是以字节为单位的。

4. memcmp

函数原型

intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);

功能
比较指定的两块内存块的内容,比较从ptr1ptr2指针指向的位置开始,向后的num个字节
memcmp的使用需要包含<string.h>

参数

  • ptr1:指针,指向一块待比较的内存块
  • ptr2:指针,指向另外一块待比较的内存块
  • num:指定的比较长度,单位是字节

返回值

返回值含义
>0ptr1内存块数据大于ptr2(以unsigned char值比较)
=0ptr1与ptr2内存块数据相等
<0ptr1内存块数据小于ptr2(以unsigned char值比较)

代码演示

#include<stdio.h>#include<string.h>intmain(){charbuffer1[]="DWgaOtP12df0";charbuffer2[]="DWGAOTP12DF0";intn;n=memcmp(buffer1,buffer2,sizeof(buffer1));if(n>0)printf("'%s' 大于 '%s'.\n",buffer1,buffer2);elseif(n<0)printf("'%s' 小于 '%s'.\n",buffer1,buffer2);elseprintf("'%s' 和 '%s' 一样.\n",buffer1,buffer2);return0;}

总结
如果要比较2块内存单元的数据的大小,可以使用memcmp函数,这个函数的特点就是可以指定比较长度。
memcmp函数是通过返回值告知大小关系的。

http://www.jsqmd.com/news/585114/

相关文章:

  • YOLOE镜像从入门到精通:环境激活、代码预测、训练微调全流程
  • 别只盯着树莓派!聊聊GEC6818这块国产ARM板在嵌入式学习中的独特优势与避坑指南
  • DeepSeek-OCR-2实战:精准提取合同条款,自动生成结构化法律文书
  • SpringBoot+MybatisPlus分页实战:IPage拦截器原理与5个常见坑点解析
  • 2026年热门的量热仪/微机全自动量热仪/鹤壁全自动量热仪厂家推荐与选型指南 - 行业平台推荐
  • 保姆级教程:在PHPStudy环境下复现CTFHub MySQL注入题(附WAF绕过Payload分析)
  • 别再写“超级循环“了!裸机系统跑得快的秘密,全在架构上
  • Ostrakon-VL赋能Agent开发:构建具备视觉感知的自动化工作流
  • 利用卷积神经网络原理优化万象熔炉·丹青幻境的图像生成效果
  • SecGPT-14B领域适配:让OpenClaw更好理解医疗行业安全策略
  • 2026年3月,找回收电力物资服务,这些选择别错过!回收电力物资口碑推荐技术领航,品质之选 - 品牌推荐师
  • MogFace人脸检测模型-WebUI开源可部署:基于CVPR2022论文复现的全栈可商用方案
  • 2026年知名的自动工业分析仪/微机全自动工业分析仪/鹤壁全自动工业分析仪/双炉工业分析仪深度厂家推荐 - 行业平台推荐
  • 013、软件定时器(Software Timers)管理与应用:从一次内存泄漏说起
  • 零售AI开发者必看:Ostrakon-VL-8B终端从部署到任务执行完整指南
  • AutoGLM-Phone-9B实战体验:用手机AI帮你看图说话、听音辨物
  • 24小时无人值守:OpenClaw+Phi-3-vision-128k-instruct自动化监控系统
  • 【软考中级系统集成项目管理】1.3 产业现代化(1.3.1 农业农村现代化)
  • Qwen3-14B企业应用部署:从镜像拉取到API接入的完整流程
  • 智能邮件秘书:OpenClaw+Qwen3.5-9B自动分类与优先级回复
  • 从零构建ADI硬件开发环境:基于HDL与No-OS的Vivado工程实战
  • Fish Speech 1.5真实作品集:新闻播报/小说朗读/多语种广告语音效果展示
  • DeOldify跨框架模型转换:从PyTorch到ONNX及TensorRT加速
  • Pixel Language Portal 目标检测集成:YOLOv5 辅助像素场景元素识别
  • 效率翻3倍!JNPF低代码工作流搭建办公快车道
  • Kandinsky-5.0-I2V-Lite-5s创意实践:利用MATLAB进行视频风格分析与参数调优
  • 2026年热门的非标热压机/小型热压机/全自动热压机定制加工厂家推荐 - 行业平台推荐
  • OpenClaw+百川2-13B:3个低代码自动化办公场景实测
  • Qwen2-VL-2B-Instruct创意效果展示:将随手草图转化为产品设计文档
  • Bidili Generator快速上手:Streamlit界面上传配置+实时预览生成效果