C语言中的内存操作函数:memcpy、memcmp与memset

一、memcpy —— 内存拷贝

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

memcpy函数用于将源内存区域的内容复制到目标内存区域。功能是将从source指向的内存起始位置连续num个字节的数据,原样复制到destination指向的内存区域。

例如:

void* My_memcpy(void * dest, const void * src,size_t sz) {// ...
}int main() {int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };My_memcpy(arr1+2,arr1,sizeof(arr1)); // 将arr1的前20个字节复制到arr1+2开始的位置// 复制后arr1内存情况:// | 1 | 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |// 打印数组内容for (int i = 0; i < 10; i++) {printf("%d ", arr1[i]);}return 0;
}

在上述自定义实现的My_memcpy函数中,根据目标和源地址的大小关系,分别采用了不同的复制策略,以防止在复制过程中对已复制的部分造成覆盖。

二、memcmp —— 内存比较

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

memcmp函数用于比较两个内存区域的前num个字节内容。功能是对ptr1ptr2所指内存的前num个字节进行逐个比较,返回值为负数、零或正数,表示ptr1区域小于、等于或大于ptr2区域。

例如:

int main() {int arr1[] = { 1,2,3,4,5,6,7,8 };int arr2[] = { 1,2,3,4,6,6,7,8 };int a = memcmp(arr1, arr2,20); // 比较arr1和arr2前20个字节(实际元素个数不足20)// 前四个字节相同,第五个字节arr1[4]=5,arr2[4]=6,因此a<0printf("%d ", a); // 输出负数return 0;
}

此处注意,虽然数组的实际元素个数不足20,但memcmp会继续比较数组之后的内存(可能未初始化),这可能导致不可预期的结果。

三、memset —— 内存设置

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

memset函数用于将指定内存区域填充为特定的字符。功能是从ptr指向的内存地址开始,将接下来num个字节全部填充为整型变量value对应的ASCII字符(对于非字符类型,填充的是该类型的value)。

例如:

int main() {int arr[10] = { 0 };memset(arr,1,12); // 将arr数组的前12个字节(即前三个整数)填充为1(假设int为4字节)// 填充后arr内存情况(假设int为4字节):// | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |return 0;
}

这里需要注意,如果num不是目标类型长度的整数倍,那么最后一个对象可能会部分填充。例如上例中,由于num=12int为4字节,所以最后会有一个整数只填充了前三个字节,剩余一个字节保持原值。

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

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

相关文章

创新大赛专访丨移步到岗荣膺2023年度人力资源服务质量卓越品牌:“人财税法”综合解决方案专家

日前&#xff0c;2023第三届全国人力资源创新大赛颁奖典礼暨成果展圆满举行。自2023年10月份启动以来&#xff0c;大赛共吸引了457个案例报名参赛&#xff0c;经组委会专家团队评审严格审核&#xff0c;企业赛道共有103个案例获奖、72家企业、13位个人、7个产业园斩获荣誉。 广…

RocketMQ消息队列(一)—— 基本概念和消息类型

RocketMQ是一个来自阿里巴巴的分布式消息中间件&#xff0c;于2012年开源&#xff0c;并在2017年正式成为Apache顶级项目。据了解&#xff0c;包括阿里云上的消息产品以及收购的子公司在内&#xff0c;阿里集团的消息产品全线都运行在RocketMQ上&#xff0c;并且最近几年的双十…

mybatis的一级缓存和二级缓存

一、介绍 1、mybatis缓存&#xff1a; mybatis包含一个非常强大的查询缓存特性&#xff0c;可以非常方便的定制和配置缓存&#xff0c;通过缓存减少Java Application与数据库的交互次数&#xff0c;从而提升程序的运行效率。 2、mybatis一二级缓存 mybatis的缓存分为一级缓存…

Docker中配置MySql环境

目录 一、简单安装 1. 首先从Docker Hub中拉取镜像 2. 启动尝试创建MySQL容器&#xff0c;并设置挂载卷。 3. 查看mysql8这个容器是否启动成功 4. 如果已经成功启动&#xff0c;进入容器中简单测试 4.1 进入容器 4.2 登录mysql中 4.3 进行简单添加查找测试 二、主从复…

MySQL-----初识

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

97 C++对象模型探索。局部静态对象,对象数组构造析构和内存分配

一&#xff0c;局部静态对象的构造和析构 如果我们不调用 静态对象 实例化的函数&#xff0c;则不会触发 静态对象的构造函数 局部静态对象&#xff0c;内存地址是在编译期间就确定好的&#xff0c;且会将内存初始化为0. 局部静态对象只会被构造一次。 局部静态对象的析构是…

MySQL亿级数据的查询优化-历史表该如何建

前端时间在知乎上看到一个问题&#xff0c;今天有空整理并测试了一下&#xff1a; 这个问题很具体&#xff0c;所以还是可以去尝试优化一下&#xff0c;我们基于InnoDB并使用自增主键来讲。 比较简单的做法是将历史数据存放到另一个表中&#xff0c;与最近的数据分开。那是不是…

如何使用Linux Archcraft结合内网穿透实现SSH远程连接

&#x1f4d1;前言 本文主要是使用Linux Archcraft结合内网穿透实现SSH远程连接的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#…

go gin 响应数据

go gin 响应数据 package mainimport ("fmt""github.com/gin-gonic/gin" )type UserInfo struct {UserName string json:"user_name"Age int json:"age"Password string json:"-" }func JsonTest(ctx *gin.Context…

黑马Java——常见API

一、游戏打包exe 游戏打包exe要考虑的因素&#xff1a; 游戏打包exe核心步骤&#xff1a; 详见《打包exe文档》 二、Math &#xff08;一&#xff09; Math类的常用方法 1、代码实现 2、小结

JVM 笔记

JVM HotSpot Java二进制字节码的运行环境 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;具有垃圾回收功能数组下标越界检查多态&#xff08;虚方法表&#xff09; JVM组成 类加载子系统&#xff08;Java代码转换为字节码&#xff09;运行时数据…

openEuler 22.03 登录提示设置

在openEuler系统中&#xff0c;您可以通过编辑 /etc/motd 文件来设置登录提示信息。motd 是 “Message of the Day” 的缩写&#xff0c;它通常包含当天的提示信息&#xff0c;在用户成功登录到Linux系统后显示。 以下是详细步骤&#xff1a;1、打开终端。2、使用文本编辑器打开…

【JavaEE进阶】 图书管理系统开发日记——贰

文章目录 &#x1f332;前言&#x1f384;设计数据库&#x1f343;引⼊MyBatis和MySQL驱动依赖&#x1f333;Model创建&#x1f38d;约定前后端交互接口&#x1f340;服务器代码&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f334;效果展示⭕总结 &#…

01- k8s基础网络知识 之 underlay与overlay网络

前言&#xff1a; 我们在学习k8s网络之前&#xff0c;必须要了解k8s网络相关的一些基础知识&#xff0c;比如什么是underlay网络、overlay网络等&#xff0c;只有把基础知识掌握之后&#xff0c;后续学习k8s网络的时候&#xff0c;一些知识点就不会再云里雾里了。 1 underlay与…

协作办公开源神器:ONLYOFFICE

目录 前言ONLYOFFICE为什么选择ONLYOFFICE强大的文档编辑功能多种协作方式多人在线协同支持跨端多平台连接器安全性极高本地部署 ONLYOFFICE 8.0版本震撼来袭可填写的 PDF 表单显示协作用户头像更新插件界面设计更快更强大 总结 前言 近几年来&#xff0c;随着互联网技术的不断…

如何解决 docker registry x509 证书不信任问题?

最近想尝试一下极狐GitLab&#xff08;可以理解为 GitLab 在中国的发行版&#xff09;内置的容器镜像仓库&#xff0c;这样就不用自己安装 Harbor 之类的了。于是找了个服务器安装了一个极狐GitLab 的私有化部署版本&#xff0c;安装过程可以参考过往的技术文章使用Omnibus 安装…

2024前端技术趋势分析

文章目录 前端技术趋势分析无代码/低代码开发优点主要应用场景目前代表性技术 WebAssembly优点应用场景代表性技术 跨平台技术优点应用场景代表性技术 人工智能在前端的应用优点应用场景 总结 前端技术趋势分析 前端技术是 Web 开发的重要组成部分&#xff0c;它负责呈现用户界…

nodejs制作一个简单线程池

ThreadPool 类 const { Worker,parentPort,isMainThread } require(worker_threads) //主线程 if(isMainThread){class ThreadPool {size 5;queue [];workerGroup [];free0;maxFree2;monitornull;constructor(size) {this.size size;}//初始化子线程init(){for (let i 0…

在Windows搭建gRPC C++开发环境

本文介绍在Windows下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境&#xff0c;以及开发、配置一个简单的c服务端以及.net客户端。 0、前置条件 1、下载gRPC源码 使用git命令行在预备存放grpc源码的目录下执行, 此处我们下载的是 grpc 1.48.0 git clone -b v1.48.0 …

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…