C语言内存函数及模拟实现

之前写的字符函数都只针对字符串,而内存函数是针对内存的,不在乎内存里面是什么。

目录

  • memcpy
    • 函数介绍
    • 模拟实现
  • memmove
    • 函数介绍
    • 模拟实现
  • memset
    • 函数介绍
  • memcmp

memcpy

函数介绍

void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
这个函数在遇到’\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

模拟实现

void* my_memcpy(void* str1, const void* str2, size_t num)
{void* ret = str1;assert(str1 && str2);while (num--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;
}

由于memcpy函数的特性,不能拷贝内存重叠的区域,拷贝内存重叠区域可以使用memmove函数。

memmove

函数介绍

void *memmove(void *str1, const void *str2, size_t n)
从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

模拟实现

void* my_memmove(void* str1, const void* str2, size_t num)
{void* ret = str1;assert(str1 && str2);if (str1 < str2){while (num--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}}else{while (num--)//进入循环刚好少1,比如拷贝5个,刚好是 +4{*((char*)str1 + num) = *((char*)str2 + num);}}return ret;
}

memset

内存设置函数。

函数介绍

void *memset(void *str, int c, size_t n)用于将一段内存区域设置为指定的值。
memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。注意是以字节为单位,而不是整型。

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。

memcmp

内存比较函数

int memcmp(const void *str1, const void *str2, size_t n)
str1 – 指向内存块的指针。
str2 – 指向内存块的指针。
n – 要被比较的字节数。
从参数地址开始比较,按照字节单位向后比较
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2。

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

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

相关文章

什么是ar.exe?

2024年4月28日&#xff0c;周日上午 ar.exe 是一个用于创建、修改以及提取静态库&#xff08;archive&#xff09;文件的工具。静态库是一种包含已编译目标文件的归档文件&#xff0c;通常用于代码的静态链接。ar 工具通常与 C/C 编译器一起使用&#xff0c;用于创建和管理静态…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…

如何用OceanBase的 Load Data 导入CSV文件

0 前言 CSV文件&#xff08;Comma-Separated Values&#xff0c;字符分隔值&#xff09;是一种普遍采用的数据存储格式&#xff0c;有不少企业和机构都用它来进行数据的管理和存储。身为开发者&#xff0c;您可能经常遇到这样的需求&#xff1a;需要将CSV的数据导入OceanBase数…

OpenCV如何实现背投

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 Ope…

stm32单片机开发二、定时器-内部时钟中断和外部时钟中断、编码器

定时器本质就是一个计数器 案例&#xff1a;定时器定时中断 内部时钟中断 Timer_Init(); //定时中断初始化 /*** 函 数&#xff1a;定时中断初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Timer_Init(void) {/*开启时钟*/RCC_APB1PeriphClockCmd(RCC…

纯血鸿蒙APP实战开发——Navigation实现多设备适配案例

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

创建基于时间的 UUID

概述 在本文中&#xff0c;我们将会 对 UUIDs 和基于时间的 UUIDs&#xff08;time-based UUIDs&#xff09; 进行一些探讨。 当我们在对基于时间的 UUIDs 进行选择的时候&#xff0c;总会遇到一些好的方面和不好的方面&#xff0c;如何进行选择&#xff0c;也是我们将要简要…

B树、B+树、B*树

平衡二叉树、B树、B树、B*树 理解其中一种你就都明白了 - 知乎 补补数据结构&#xff0c;讲得很好的文章。 https://www.cnblogs.com/nanlinghan/p/10315653.html B树 二叉树 B-Tree BTree 详解_b树英文-CSDN博客 B-树&#xff08;B树&#xff09;详解 - 简书 图解B树的原…

2路模拟音频光端机 JR-CA02

概述 JR-CA02光端机由发送机JR-CA02 Tansmitter和接收机JR-CA02 Receiver组成&#xff0c;通过一定距离长度的光纤相连接&#xff0c;传输2路Audio模拟音频&#xff08;即1路立体声&#xff09;。且每路音频分配输出。 JR-CA02光端机具有运行主要技术参数的监测功能&#xff…

大数据004-hadoop002-数据

数据的存储和分析 单个硬盘存在读写的上限 如果有1TB的硬盘&#xff0c;传输速度100MB/s&#xff0c;需要2.5小时读完 多个硬盘同时读写 如果有100个硬盘&#xff0c;每个硬盘存储1%&#xff0c;读取完不到2分钟。 以上是一个数据&#xff0c;如果有很多个数据集&#xff0…

【AGX】Ubuntu20.04 + ROS_ noetic+ 大疆Mid360激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;最近组装机器人&#xff0c;使用到了大疆孵化的圳市览沃科技有限公司&#xff08;简称Livox览沃科技&#xff09;推出的觅道系列全新混合固态激光雷达Mid-360&#xff0c;顺便试试效果&#xff0c;也记录一下使用入门过程。 "觅道M…

MATLAB : interp1()用法介绍

目录 一、基本语法&#xff1a; 二、实例&#xff1a; 1.样条拟合减振器阻尼曲线 ​2.PP拟合时间温度曲线 interp1 是 MATLAB 中的一个函数&#xff0c;用于在一维数据上执行插值操作。这个函数可以帮助你估计或计算已知数据点之间未知点的值。以下是 interp1 函数的基本用…

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测&#xff08;Matlab实…

MySQL——88张表汇总——DDL+外键

外键er图 88张表 /* Navicat MySQL Data TransferSource Server : MyList Source Server Version : 50726 Source Host : localhost:3309 Source Database : schooldbTarget Server Type : MYSQL Target Server Version : 50726 File Encoding …

《深入解析Windows操作系统》第3章读书笔记

1、陷阱分发&#xff1a;中断和异常是导致处理器转向正常控制流之外代码的两种操作系统条件。陷阱的定义如下&#xff1a;当异常或者中断发生时&#xff0c;处理器捕捉到一个执行线程&#xff0c;并且将控制权转移到操作系统中某一个固定地址处。在Windows系统中&#xff0c;处…

Pycharm:常用插件安装和使用

简介&#xff1a;好用的插件可以美化界面或者提升效率&#xff0c;使工作事半功倍。 推荐插件&#xff1a; 1、CSV插件&#xff1a;美化csv数据展示 2、Translation&#xff1a;翻译的插件&#xff0c;可以进行中英互译 3、CodeGlance&#xff1a;代码小地图 4、Markdown …

代码随想录:二叉树29-30

目录 701.二叉搜索树中的插入操作 题目 代码&#xff08;迭代法走一边&#xff09; 代码&#xff08;递归法走一边&#xff09; 450.删除二叉搜索树中的节点 题目 代码&#xff08;递归法走一边&#xff09; 701.二叉搜索树中的插入操作 题目 给定二叉搜索树&#xff…

【软考高项】二十七、范围管理6个过程

一、规划范围管理 1、定义、作用 定义&#xff1a;为了记录如何定义、确认和控制项目范围及产品范围&#xff0c;而创建范围管理计划的过程作用&#xff1a;在整个项目期间对如何管理范围提供指南和方向 2、输入 项目章程 项目管理计划&#xff1a;质量管理计划、项目生命周…

编程本源

文章目录 引言编程的本质工作与编程编程的未来 引言 知乎上有一个热门的问题&#xff0c;什么是人生的顶级享受&#xff1f; 看到这个问题我回想到了多年前&#xff0c;那个炎热的午后&#xff0c;我在学校的图书馆里&#xff0c;一边参照书籍&#xff0c;一边用着一部破旧的t…