news 2026/2/17 12:03:01

C语言内存函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言内存函数

在使用内存函数的时候我们需要包含<stdlib.h>的头文件

目录

一 memcpy使⽤和模拟实现

(1)使用

(2)模拟实现

二 memmove使⽤和模拟实现

(1)使用

(2)模拟实现

三 memset函数的使⽤

四 memcmp函数的使⽤


一 memcpy使⽤和模拟实现

(1)使用

我们先来查看一下memcpy函数的相关的语法知识

我们可以看到这个memcpy函数似乎和strncpy函数有异曲同工的地方

  • memcpy:通用型,可处理任意数据类型(字符、整型、浮点型、结构体、数组等)。比如可以直接拷贝一个int数组,或一个struct对象。
  • strncpy:只能处理字符串(以\0结尾的字符数组),对非字符串数据处理无意义。

所以我们来给出一个memcpy函数的代码示例:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int a[] = { 1,2,3,4,5 }; int b[10] = { 0 }; memcpy(b, a, sizeof(a)); for (int i = 0; i < 5; i++) { printf("%d ", b[i]); } return 0; }

注意这里的第三个参数代表的是字节数,不是数据的个数.

(2)模拟实现
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> void* mymemcpy(void* dest, void* sor, int size) { assert(dest); assert(sor); void* ret = dest; while (size--) { *((char*)dest) = *((char*)sor); dest = ((char*)dest)++; sor = ((char*)sor)++; } return ret; } int main() { int a[] = { 1,2,3,4,5 }; int b[10] = { 0 }; mymemcpy(b, a, sizeof(a)); for (int i = 0; i < 5; i++) { printf("%d ", b[i]); } return 0; }

二 memmove使⽤和模拟实现

(1)使用

在我们使用memcpy的时候我们如果要处理的是重复的内存的复制呢,也就是将数组内的前5个数据,向后复制,似乎memcpy就无法处理这个问题

• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

下面将给出代码的示例:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int a[10] = { 1,2,3,4,5,8,9 }; memmove(a+2, a, sizeof(int) * 3); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }

运行结果如图所示:

那么这个函数该怎么实现呢???

(2)模拟实现

再给出代码之前我们来看几张图片:

如果我们将要处理的情况是这样的时候我们应该怎么实现数据的转移呢?

d>s的情况

如果我们从头开始转移的话我们可以看到之后的数据将会被我们修改导致错误.

但是当我们这样处理的时候就解决了问题.

那是否从尾部开始转移就能解决全部的情况呢?

在这样的情况下试试呢

我们可以看到在这种情况下尾部开始就不能使用了.

但是这时候从头部开始又可行了.

所以在模拟实现这个代码的核心就是弄清楚从头部,从尾部的分节点.

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> void* mymemmove(void* dest, void* sor, int size) { assert(dest); assert(sor); void* ret = dest; if (dest <= sor || (char*)dest > (char*)sor + size) { while (size--) { *((char*)dest) = *((char*)sor); dest = (char*)dest + 1; sor = (char*)sor + 1; } } else { dest = (char*)dest + size - 1; sor = (char*)sor + size - 1; while (size--) { *((char*)dest) = *((char*)sor); dest = (char*)dest - 1; sor = (char*)sor - 1; } } return ret; } int main() { int a[10] = { 1,2,3,4,5,8,9 }; mymemmove(a+2, a, sizeof(int) * 3); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }

三 memset函数的使⽤

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

代码示例:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int a[10] = { 1,2,4,5,6,7,8,8 }; memset(a, 0, sizeof(a)); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }

运行结果如图所示:

四 memcmp函数的使⽤

• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节

返回值如下:

代码示例:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { char a[] = "hello"; char b[] = "heLLo"; int an=memcmp(a, b, sizeof(a)); printf("%d", an); return 0; }

今天的内容就结束了,谢谢大家的观看,

之后我将会讲解有关结构体的语法知识.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 15:50:30

Zepp Life自动刷步数终极指南:3步搞定微信运动同步

Zepp Life自动刷步数终极指南&#xff1a;3步搞定微信运动同步 【免费下载链接】mimotion 小米运动刷步数&#xff08;微信支付宝&#xff09;支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 还在为每天凑不够微信运动步数而烦恼&#xff1f;想要…

作者头像 李华
网站建设 2026/2/17 7:23:36

工业设备中RS232引脚功能解析:深度剖析通信标准

工业现场的“老派”通信&#xff1a;为什么我们还在用RS232&#xff1f;你有没有遇到过这种情况——在调试一台新到厂的PLC时&#xff0c;翻遍机身却只找到一个9针的串口&#xff1f;没有网口&#xff0c;也没有USB&#xff0c;只有那根泛黄标签上写着“COM”的线缆。那一刻&am…

作者头像 李华
网站建设 2026/2/12 12:14:32

使用MTKClient处理MTK设备BROM模式连接异常的技术实践

使用MTKClient处理MTK设备BROM模式连接异常的技术实践 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 问题现象与初步诊断 在进行MTK芯片设备刷机操作时&#xff0c;经常会遇到设备无法正…

作者头像 李华
网站建设 2026/2/16 17:48:52

抖音直播数据实时采集:构建你的智能监控分析系统

抖音直播数据实时采集&#xff1a;构建你的智能监控分析系统 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2024最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 还在为无法实时获取抖音直…

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

深蓝词库转换:轻松实现跨平台输入法词库迁移解决方案

深蓝词库转换&#xff1a;轻松实现跨平台输入法词库迁移解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换设备或输入法时丢失宝贵词库而烦恼吗&…

作者头像 李华
网站建设 2026/2/13 5:57:46

BBDown终极指南:10个技巧让你的B站视频永久保存

你是否曾经遇到过这样的困境&#xff1f;精心收藏的B站学习视频突然下架&#xff0c;想离线观看的课程内容无法缓存&#xff0c;或者需要批量保存UP主的系列作品却无从下手&#xff1f;这些困扰无数用户的痛点&#xff0c;现在有了完美的解决方案——BBDown工具&#xff0c;这款…

作者头像 李华