C语言内存函数(memcpy及memove的了解与使用)

news/2024/4/27 18:00:52/文章来源:https://blog.csdn.net/czzlv/article/details/136993284

前言:

        前边我们了解了一些字符函数的使用以及它是如何实现的,但是我们会发现这些函数只可以针对字符串使用,对于其它类型的数据我们将无法使用这个函数的功能,那么我们今天就带着兄弟们了解一下何为内存函数,内存函数又可以实现哪些功能,它针对的类型又是什么

内存函数:

1. memcpy使⽤和模拟实现

2. memmove使⽤和模拟实现

3. memset函数的使⽤

4. memcmp函数的使⽤

1. memcpy函数:

1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
2. 这个函数在遇到 '\0' 的时候并不会停下来
3. 如果source和destination有任何的重叠,复制的结果都是未定义的

语法:

void * memcpy ( void * destination, const void * source, size_t num );
(注意:此处的num代表的是num个字节数,并非一个元素)

举例:

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,0 };int arr1[20] = { 0 };memcpy(arr1, arr, 16);  
//此处的16代表着16个字节,而我们访问的数组是int型,所以此处拷贝的是4个元素for (int i = 0; i < 20; i++){printf("%d ", arr1[i]);}}//执行结果为
1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

memcpy的模拟实现():

memcpy函数模拟实现
#include <assert.h>   //assert函数的头文件
//由于们memcpy函数是可以实现多种数据的拷贝,所以此处传入时指针的类型为void* ,方便后续强制转换
void* in_memcpy(void* destination, const void* source, size_t num)  
{void* ret = destination;assert(destination && source);  //判断传入的两个指针是否为空while (num--){*(char*)destination = *(char*)source;  //逐字节交换((char*)destination)++;((char*)source)++;}return ret;  //返回值
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,0 };int arr1[20] = { 0 };void* ret = in_memcpy(arr1, arr, 16);  //16为字节数for (int i = 0; i < 20; i++){printf("%d ", arr1[i]);}return 0;
}

2. memove函数:

1. 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的
2. 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理

语法:

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

#include <string.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,0 };int arr1[20] = { 0 };
//从3开始拷贝三个元素到1往后三个元素的位置memmove(arr, arr+2, 12);  //12表示12个字节数 此处等于3个int元素for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}
}

memmove函数的模拟实现:

#include <stdio.h>
#include <assert.h>
#include <string.h>
void* in_memove(void* destination, const void* source, size_t num)
{void* ret = destination;assert(destination && source);
//此处判断满足条件从前面拷贝,不满足从后边拷贝if (destination <= source || (char*)destination >= (char*)source + num){while (num--){*(char*)destination = *(char*)source;((char*)destination)++;((char*)source)++;}}else{destination = (char*)destination + num - 1;source = (char*)source + num - 1;while (num--){*(char*)destination = *(char*)source;((char*)destination)--;((char*)source)--;}}return ret;
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,0 };int arr1[20] = { 0 };void* ret = in_memove(arr, arr+2, 12);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}
}//执行结果
3 4 5 4 5 6 7 8 9 0

3. memset函数

memset函数将内存中以字节为单位你想要设置的值设置为你想要的内容

语法:

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

举例:

#include <string.h>
int main()
{char arr[] = "L love china";memset(arr, 'x', 5);for (int i = 0; i < 10; i++){printf("%c", arr[i]);}
}//执行结果
xxxxxe china

4. memcmp函数:

语法:

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

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

(注:此处是逐字节比较,大于返回>0的数,小于返回<0的数,等于则=0)

举例:

#include <string.h>
int main()
{char arr[] = "abcdf";char arr1[] = "abced";int ret = memcmp(arr, arr1, 4);printf("%d\n", ret);
}//执行结果(此时arr<arr1,所以返回小于0的数)
vs2022返回-1

(今日分享到此结束,有啥高见欢迎评论区留言,Thanks♪(・ω・)ノ!!!)

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

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

相关文章

yolov8 pose keypoint解读

yolov8进行关键点检测的代码如下&#xff1a; from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # pretrained YOLOv8n model# Run batched inference on a list of images results model([im1.jpg, im2.jpg]) # return a list of Results objects# Pr…

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04&#xff0c;树莓派4B&#xff0c;SD卡读卡器 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…

企业微信可以更换公司主体吗?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

springboot多模块

这里springboot使用idea中的 Spring Initializr 来快速创建。 一、demo 1、创建父项目 首先使用 Spring Initializr 来快速创建好一个父Maven工程。然后删除无关的文件&#xff0c;只需保留pom.xml 文件。 &#xff08;1&#xff09;new Project -> spring initializr快…

基于spring boot的个人博客系统的设计与实现(带源码)

随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的个人博客系统&#xff0c;有管理员&#xff0c;用户&#xff0c;博主…

从一次 RPC 请求,探索 MOSN 的工作流程

王程铭&#xff08;呈铭&#xff09; 蚂蚁集团技术工程师&#xff0c;Apache Committer 专注 RPC、Service Mesh 和云原生等领域。 本文 7368 字&#xff0c;预计阅读 15 分钟 前言 MOSN&#xff08;Modular Open Smart Network&#xff09;是一款主要使用 Go 语言开发的云…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09;2.6 更多的导数例子&#xff08;More Derivative Examples&…

Node.js学习(一)

版权声明 本文章由B站上的黑马课程整理所得&#xff0c;仅供个人学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识产权的良好环境…

【二叉树】Leetcode 543. 二叉树的直径【简单】

二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例1&#xff1a; 输入&#xff1a;root [1,2…

C语言实现顺序表(增,删,改,查)

目录 一.概念&#xff1a; 1.静态顺序表&#xff1a;使用定长数组存储元素。 2.动态顺序表&#xff1a;使用动态开辟的数组存储。 二.顺序表的实现: 1.顺序表增加元素 1.检查顺序表 2.头插 3.尾插 2.顺序表删除元素 1.头删 2.尾删 3.指定位置删 3.顺序表查找元素 …

使用Qt生成图片

Qt之生成png/jpg/bmp格式图片_qt生成图片-CSDN博客 (1)使用QPainter 示例关键代码&#xff1a; QImage image(QSize(this->width(),this->height()),QImage::Format_ARGB32);image.fill("white");QPainter *painter new QPainter(&image);painter->…

深入浅出:探索Hadoop生态系统的核心组件与技术架构

目录 前言 HDFS Yarn Hive HBase Spark及Spark Streaming 书本与课程推荐 关于作者&#xff1a; 推荐理由&#xff1a; 作者直播推荐&#xff1a; 前言 进入大数据阶段就意味着 进入NoSQL阶段&#xff0c;更多的是面向OLAP场景&#xff0c;即数据仓库、BI应用等。 …

TCPView下载安装使用教程(图文教程)超详细

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 TCPView是微软提供的一款「查看网络连接」和进程的工具&#xff0c;常用来查看电脑上的TCP/UDP连接…

【Leetcode】2580. 统计将重叠区间合并成组的方案数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个二维整数数组 ranges &#xff0c;其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间&#xff08;包括二者&#xff09;的所有整数都包含在第 i 个区间中。 你需要…

MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

本文基于 Linux 内核 5.4 版本进行讨论 自上篇文章《从 Linux 内核角度探秘 JDK MappedByteBuffer》 发布之后&#xff0c;很多读者朋友私信我说&#xff0c;文章的信息量太大了&#xff0c;其中很多章节介绍的内容都是大家非常想要了解&#xff0c;并且是频繁被搜索的内容&…

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机&#xff0c;下一步下一步 注意虚拟机配置网络桥接&#xff0c;CD/DVD选择本地的镜像地址 开启此虚拟机&#xff0c;下一步下一步等待镜像安装。 3…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令&#xff1a;ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车&#xff0c;直到出现类似以下界面&#xff1a; 2、查看密钥 路径&#xff1a;C:\U…

银行监管报送系统介绍(十一):金融基础数据报送系统

为了全面落实和实现国务院办公厅下发《关于全面推进金融业综合统计工作的意见》中的综合统计工作的总体目标&#xff0c;中国人民银行调查统计司于2020年6月12日下发了《关于建立金融基础数据统计制度的通知&#xff08;试行&#xff09;》。 2020金融基础数据采集报送 报送时…

Kubernetes概念:服务、负载均衡和联网:2. Gateway API

Gateway API 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/gateway/ Gateway API 通过使用可扩展的、角色导向的、 协议感知的配置机制来提供网络服务。它是一个附加组件&#xff0c; 包含可提供动态基础设施配置和高级流量路由的 API…