C语言-内存函数详解

文章目录

    • 1. memcpy使用和模拟实现
    • 2. memmove使用和模拟实现
    • 3. memset函数的使用
    • 4. memcmp函数的使用


1. memcpy使用和模拟实现

返回类型和参数:

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

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的。
4.注意单位是字节
5.头文件:#include<string.h>

memcpy使用:

int main() {int arr[20] = { 0 };//目标数组int arr1[] = { 1,2,3,4,5 };//源数组memcpy(arr, arr1, 20);//20单位是字节for (int i = 0; i < 5; i++) {//拷贝完打印printf("%d ", arr[i]);}return 0;
}

运行结果:
在这里插入图片描述

memcpy模拟实现

1.我们创建一个返回类型和参数于memcpy函数相同的函数
2.因为memcpy函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.通过循环来拷贝

代码实现:

void* mn_memcpy(void* p1, const void* p2, size_t n) {assert(p1);//判断是否为空指针,参数和类型memcpy一样assert(p2);while (n) {//控制拷贝多少个字节*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)((char*)p1)++; ((char*)p2)++;n--;//}
}
int main() {int arr[20] = { 0 };int arr1[] = { 1,2,3,4,5 };mn_memcpy(arr, arr1, 20);for (int i = 0; i < 5; i++) {//拷贝完打印printf("%d ", arr[i]);}return 0;
}

运行结果:
在这里插入图片描述

2. memmove使用和模拟实现

返回类型和参数:

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

1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2. 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
3. 单位是字节
4. 头文件:#include<string.h>

memmove 使用:

 int main() {int arr1[] = { 1,2,3,4,5 };memmove(arr1+1, arr1, 3*sizeof(int));for (int i = 0; i < 5; i++) {//拷贝完打印printf("%d ", arr1[i]);}return 0;
}

运行结果:
在这里插入图片描述
memmove模拟:

1.我们创建一个返回类型和参数于memmove函数相同的函数
2.因为memmove函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.我们要分三种情况考虑,再通过循环拷贝

三种情况:
在这里插入图片描述

代码实现:

void* mn_memmove(void* p1, const void* p2, size_t n) {assert(p1);//判断是否为NULLassert(p2);if (p1 <= p2 || (char*)p1 >= (char*)p2 + n)//包含两种情况,直接按顺序拷贝{while (n) {*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)((char*)p1)++; //(char*)p1加加,字节加一((char*)p2)++;n--;}}else {//第三种情况 倒序拷贝p1 = (char*)p1 + n - 1;p2 = (char*)p2 + n - 1;while (n) {*((char*)p1) = *((char*)p2);((char*)p1)--;((char*)p2)--;n--;}}
}
int main() {int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };mn_memmove(arr1+1, arr1, 3*sizeof(int));for (int i = 0; i < 10; i++) {//拷贝完打印printf("%d ", arr1[i]);}return 0;}

运行结果:
在这里插入图片描述

3. memset函数的使用

返回类型和参数

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

1.memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
2. 头文件:#include<string.h>

使用:

int main() {char arr[] = "qwert";memset(arr, '0', 3 * sizeof(char));printf("%s", arr);return 0;
}

运行结果:
在这里插入图片描述

4. memcmp函数的使用

返回类型和参数:

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

1.比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
2. 头文件:#include<string.h>

返回值:
在这里插入图片描述
使用:

int main() {char arr[] = "qwert";char arr1[] = "abcdf";if (memcmp(arr, arr1))printf("arr>arr1");elseprintf("arr1>arr");return 0;
}

运行结果:
在这里插入图片描述

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

设备树是什么?

设备树&#xff1a; 设备树DTS(Device Tree Source) 描述设备信息的独立的文件。 为什么要引入设备树&#xff1f; 随着芯片的发展&#xff0c;Linux内核中就包含着越来越多这些描述设备的代码&#xff0c;导致Linux内核代码会很臃肿。因此引入了设备树文件&#xff0c;从…

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试(1)

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试&#xff08;1&#xff09; 进行了多组实验&#xff0c;包括顺逆时针转向&#xff0c;直线圆弧轨迹行驶&#xff0c;以及Pure-Pursuit 轨迹跟踪测试 代码修改 需要修改的代码并不多&#xff0c;主要对 gps_sensor 功能包和…

Java中的泛型是什么?如何使用泛型类和泛型方法?

Java 中的泛型是一种编程机制&#xff0c;允许你编写可以与多种数据类型一起工作的代码&#xff0c;同时提供编译时类型检查以确保类型的安全性。泛型的主要目的是提高代码的可重用性、类型安全性和程序的整体性能。 泛型类&#xff08;Generic Class&#xff09;: 在泛型类中…

【教3妹学编程-算法题】统计子串中的唯一字符

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

关于python中的nonlocal关键字

如果在函数的子函数中需要调用外部变量&#xff0c;一般会看见一个nonlocal声明&#xff0c;类似下面这种&#xff1a; def outer_function():x 10def inner_function():nonlocal xx 1print(x)inner_function()outer_function()在这个例子中&#xff0c;inner_function 引用…

【DevOps】基于 KubeSphere 的 Kubernetes 生产实践之旅(万字长文)

基于 KubeSphere 的 Kubernetes 生产实践 1.KubeSphere 简介1.1 全栈的 Kubernetes 容器云 PaaS 解决方案1.2 选型理由&#xff08;从运维的角度考虑&#xff09; 2.部署架构图3.节点规划3.1 软件版本3.2 规划说明3.2.1 K8s 集群规划3.2.2 存储集群3.2.3 中间件集群3.2.4 网络规…

SpringBoot——LiteFlow引擎框架

优质博文&#xff1a;IT-BLOG-CN 一、LiteFlow 简介 LiteFlow是一个轻量且强大的国产规则引擎框架&#xff0c;可用于复杂的组件化业务的编排领域。帮助系统变得更加丝滑且灵活。利用LiteFlow&#xff0c;你可以将瀑布流式的代码&#xff0c;转变成以组件为核心概念的代码结构…

计算机组成原理-Cache的基本概念和原理

文章目录 存储系统存在的问题Cache的工作原理局部性原理性能分析例题界定何为局部部分问题总结 存储系统存在的问题 增加Cache层来缓和CPU和主存的工作速度矛盾 Cache的工作原理 启动某个程序后&#xff0c;将程序的代码从辅存中取出放入内存中&#xff0c;再从内存中将代码…

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…

S25FL系列FLASH读写的FPGA实现

文章目录 实现思路具体实现子模块实现top模块 测试Something 实现思路 建议读者先对 S25FL-S 系列 FLASH 进行了解&#xff0c;我之前的博文中有详细介绍。 笔者的芯片具体型号为 S25FL256SAGNFI00&#xff0c;存储容量 256Mb&#xff0c;增强高性能 EHPLC&#xff0c;4KB 与 6…

Leetcode199. 二叉树的右视图

Every day a Leetcode 题目来源&#xff1a;199. 二叉树的右视图 解法1&#xff1a;层序遍历 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 按层序遍历&#xff0c;将每层的…

如何判断一个题目用“贪心/动态规划“还是用“BFS/DFS”方法解决

1 总结 1.1 贪心、动态规划和BFS/DFS题解的关系 一般能使用贪心、动态规划解决一个问题时&#xff0c;使用BFS&#xff0c;DFS也能解决这个题&#xff0c;但是反之不能成立。 1.2 2 贪心 -> BFS/DFS 2.1 跳跃游戏1和3的异同 这两道题&#xff0c;“跳跃游戏”&#xf…

html实现各种瀑布流(附源码)

文章目录 1.设计来源1.1 动态响应瀑布流1.2 分页瀑布流1.3 响应瀑布流 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134613121 html实现各种瀑布流(附源码)&#xff0c;…

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊&#xff01;小米在这里&#xff5e; 很高兴又有机会和大家见面啦&#xff01;最近小米参加了一场腾讯的运营面试&#xff0c;遇到了一个超有趣的问题&#xff1a;如果让你运营一个公众号&#xff0c;近期需要增加1000个关注&#xff0c;预算100元&#xff0c;怎么完成…

【阿里云】图像识别 智能分类识别 项目开发(一)

语音模块和阿里云图像识别结合 环境准备 代码实现 编译运行 写个shell脚本用于杀死运行的进程 语音模块和阿里云图像识别结合 使用语音模块和摄像头在香橙派上做垃圾智能分类识别 语音控制摄像下载上传阿里云解析功能点实现 环境准备 将语音模块接在UART5的位置 在orange…

数据结构总复习

文章目录 线性表动态分配的顺序存储结构链式存储 线性表 动态分配的顺序存储结构 通过分析代码&#xff0c;我们发现&#xff0c;要注意什么&#xff1a; 要分清你的下标Insert 函数是可以用来没有元素的时候&#xff0c;增加元素的Init(或者Create )函数一般只用来分配空间…

go atexit源码分析

文章目录 atexit源码解析UML类图样例一: 程序退出之前执行注册函数1.1 流程图1.2 代码分析 样例二&#xff1a;使用cancel取消注册函数2.1 cancel流程图2.2 代码分析 样例三&#xff1a;使用Fatal/Fatalln/Fatal执行注册函数3.1 Fatal/Fatalln/Fatal流程图3.2 代码分析 atexit源…

Android平台GB28181设备接入模块开发填坑指南

技术背景 为什么要开发Android平台GB28181设备接入模块&#xff1f;这个问题不再赘述&#xff0c;在做Android平台GB28181客户端的时候&#xff0c;媒体数据这块&#xff0c;我们已经有了很好的积累&#xff0c;因为在此之前&#xff0c;我们就开发了非常成熟的RTMP推送、轻量…

Scannet v2 数据集介绍以及子集下载展示

Scannet v2 数据集介绍以及子集下载展示 文章目录 Scannet v2 数据集介绍以及子集下载展示参考数据集简介子集scannet_frames_25kscannet_frames_test 下载脚本 download_scannetv2.py 参考 scannet数据集简介和下载-CSDN博客 scannet v2 数据集下载_scannetv2数据集_蓝羽飞鸟的…