当前位置: 首页 > news >正文

C语言——内存函数的实现和模拟实现

1. memcpy 使用和模拟实现

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

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//int类型,一个为四个四节//将arr1里前20字节复制到arr2数组中int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

对于重叠的部分,可以交给memmove处理;

memcpy函数的模拟实现:

void* memcpy(void* dst, const void* src, size_t count){void* ret = dst;assert(dst);assert(src);while (count--) {      *(char*)dst = *(char*)src;  //先是void函数未定义,在通过强类型转换,转换为char*(解引用后为一个字节)dst = (char*)dst + 1;src = (char*)src + 1;}return(ret);}

2. memmove 使用和模拟实现

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

输出结果:1 2 1 2 3 4 5 8 9 10

void * memmove ( void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)) {while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else {dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}

3. memset 函数的使用

void * memset ( void * ptr, int value, size_t num );
#include <stdio.h>
#include <string.h>
int main()
{char str[] = "hello world";memset(str, 'x', 6);printf(str);return 0;
}

输出结果:xxxxxxworld

4.memcmp 函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
  • 返回值如下:
#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DW2000000000";char buffer2[] = "DW1111111111";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0)printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0)printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

输出结果:   'DW2000000000' is greater than 'DW1111111111'.

点个赞走吧!!!

相关文章:

C语言——内存函数的实现和模拟实现

1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…...

如何优化邮箱Webhook API发送邮件的性能?

邮箱Webhook API发送邮件的流程&#xff1f;怎么用邮箱API发信&#xff1f; 高效、稳定的邮箱Webhook API发送邮件功能对于企业的日常运营至关重要。随着业务量的增长&#xff0c;如何优化邮箱Webhook API发送邮件的性能。AokSend将从多个方面探讨如何提升的效率。 邮箱Webho…...

OceanBase V4.X中常用的SQL(一)

整理了一些在OceanBase使用过程中常用的SQL语句&#xff0c;这些语句均适用于4.x版本&#xff0c;并将持续进行更新。后续还将分享一些V4.x版本常用的操作指南&#xff0c;以便更好地帮助大家使用OceanBase数据库。 集群信息 版本查看 show variables like version_comment; …...

代码随想录算法训练营第五十天|123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 这道题一下子就难度上来了&#xff0c;关键在于至多买卖两次&#xff0c;这意味着可以买卖一次&#xff0c;可以买卖两次&#xff0c;也可以不买卖。 视频讲解&#xff1a;https://www.bilibili.com/video/BV1WG411K7AR https://programmercarl.com…...

Composer安装与配置:简化PHP依赖管理的利器(包括加速镜像设置)

在现代的PHP开发中&#xff0c;我们经常会使用许多第三方库和工具来构建强大的应用程序。然而&#xff0c;手动管理这些依赖项可能会变得复杂和耗时。为了解决这个问题&#xff0c;Composer应运而生。Composer是一个PHP的依赖管理工具&#xff0c;它可以帮助我们轻松地安装、更…...

灯塔:抽象类和接口笔记

什么是构造方法 构造方法是一种特殊的方法&#xff0c;它是一个与类同名且没有返回值类型的方法。 构造方法的功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法&#xff0c;且构造方法和其他方法一样也可以重载 继承抽象类需要实现所有的抽象方法吗 继…...

mybatis 入门

MyBatis是一款持久层框架&#xff0c;免除了几乎所有的JDBC代码、参数及获取结果集工作。可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。 1 无框架下的JDBC操作 1&#xff09;加载驱动&#xff1a;Class.forName(“com.mysql.cj.jdbc.Driv…...

Spring-AI-上下文记忆

引入依赖 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...

内存函数memcpy、mommove、memset、memcmp

目录 1、memcpy函数 memcpy函数的模拟实现 2、memmove函数 memmove函数的模拟实现 3、memset函数 4、memcmp函数 1、memcpy函数 描述&#xff1a; C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 声明&…...

symfony框架介绍

Symfony是一个功能强大的PHP框架,它提供了丰富的组件和工具来简化Web开发过程。以下是一些关于Symfony的主要特点: 可重用性: Symfony提供了一系列可重用的PHP组件,这些组件可以用于任何PHP应用程序中。灵活性: Symfony允许开发者根据项目需求灵活选择使用哪些组件,而不是强…...

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…...

LabVIEW电信号傅里叶分解合成实验

LabVIEW电信号傅里叶分解合成实验 电信号的分析与处理在科研和工业领域中起着越来越重要的作用。系统以LabVIEW软件为基础&#xff0c;开发了一个集电信号的傅里叶分解、合成、频率响应及频谱分析功能于一体的虚拟仿真实验系统。系统不仅能够模拟实际电路实验箱的全部功能&…...

Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备

一、前言 记录时间 [2024-4-11] 系列文章简摘&#xff1a; Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&#xff08;Centos7下安装docker、环境配置&#xff0c;以及镜像简单使用&#xff09; Docker 学习笔记&#xff08;三&#xff09;&#x…...

csdn怎么变得这么恶心,自动把一些好的文章分享改成了vip可见

刚刚发现以前发的一些文章未经过我同意&#xff0c;被csdn自动改成了VIP可见&#xff0c;这也太恶心了&#xff0c;第一你没分钱给我&#xff0c;第二我记录下一些问题也不是为了赚钱&#xff0c;而是为了提升自己和帮助别人&#xff0c;这样搞是想逼更多人走是吗&#xff1f;...

自然语言处理NLP:文本预处理Text Pre-Processing

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容&#xff0c;助力自然语言处理和模型的生成使用。 1.文本…...

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion&#xff0c;在此过程中&#xff0c;遇到很多的网络访问不通的问题&#xff0c;通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上&#xff0c;网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…...

2024年外贸行业营销神器推荐

2024年外贸行业营销神器推荐&#xff1a;外贸人每天面对的不是国内客户&#xff0c;而是全球客户&#xff0c;相对于国内来说&#xff0c;会更加麻烦和繁琐&#xff0c;今天就码一篇2024年外贸行业营销神器的推荐文章&#xff0c;希望可以减轻各位外贸人的负担&#xff01; 1、…...

k8s高可用集群部署介绍 -- 理论

部署官网参考文档 负载均衡参考 官网两种部署模式拓扑图和介绍 介绍两种高可用模式 堆叠 拓扑图如下&#xff08;图片来自k8s官网&#xff09;&#xff1a; 特点&#xff1a;将etcd数据库作为控制平台的一员&#xff0c;由于etcd的共识算法&#xff0c;所以集群最少为3个&…...

【GDAL-Python】1-在Python中使用GDAL读写栅格文件

文章目录 1-概要2.代码实现 1-概要 提示&#xff1a;本教程介绍如何使用 Python 中的 GDAL 库将栅格数据读取为数组并将数组另存为GeoTiff 文件 视频地址&#xff1a;B站对应教程 目标&#xff1a; &#xff08;1&#xff09;读写GeoTiff影像&#xff1b; &#xff08;2&…...

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么&#xff1f; 三、构造函数还具有类型转换的作用 &#x1f34e;单参构造函数 ✨引出 explicit 关键字 &#x1f34d;多参构造函数 ✨为什么需要explicit关键字&#xff1f; ✨怎么使用explicit关键字&#xff1f; 四、总结 五…...

基于MCP协议与Google Apps Script的Google Workspace自动化集成实践

1. 项目概述&#xff1a;当Google Workspace遇上MCP如果你是一名开发者&#xff0c;或者负责企业内部的自动化流程&#xff0c;那么对Google Workspace&#xff08;谷歌工作区&#xff09;一定不陌生。从Gmail、Google Drive到Sheets、Docs和Calendar&#xff0c;它几乎构成了现…...

美国通信业去监管趋势下的技术生态变革与产业应对策略

1. 从“去监管”信号看美国通信业格局重塑 2017年初&#xff0c;当阿吉特派伊&#xff08;Ajit Pai&#xff09;正式接任美国联邦通信委员会&#xff08;FCC&#xff09;主席时&#xff0c;他的一项早期举措——为广播公司和有线电视运营商削减文书工作规定——几乎在所有人的预…...

Turms开发者定制指南:如何基于源码进行二次开发

Turms开发者定制指南&#xff1a;如何基于源码进行二次开发 【免费下载链接】turms &#x1f54a;️ The worlds most advanced open source instant messaging engine for 100K~10M concurrent users https://turms-im.github.io/docs 项目地址: https://gitcode.com/gh_mir…...

Azure流分析快速入门:构建实时数据处理管道的完整指南 [特殊字符]

Azure流分析快速入门&#xff1a;构建实时数据处理管道的完整指南 &#x1f680; 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure流分析是微软提供的实时数据分…...

Markdown元数据自动化管理:mdac-filler工具核心功能与实战指南

1. 项目概述&#xff1a;一个为Markdown文档自动填充元数据的工具如果你经常用Markdown写文档、博客或者项目README&#xff0c;肯定遇到过这样的场景&#xff1a;每次新建一个文件&#xff0c;都得手动去文件头部敲一堆“Front Matter”元数据&#xff0c;比如标题、日期、标签…...

Claude Code / Cursor 写的代码,你敢直接上线吗?我踩过一次坑,再也不敢

&#x1f449; 这是一个或许对你有用的社群&#x1f431; 一对一交流/面试小册/简历优化/求职解惑&#xff0c;欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料&#xff1a; 《项目实战&#xff08;视频&#xff09;》&#xff1a;从书中学&#xff0c;往事上…...

DevOps 与 CI/CD 实战心得:静态网站的自动化部署

背景 自己做了一个独立站项目&#xff0c;访问地址是&#xff1a;https://www.wslwf.com 通过这次实践&#xff0c;对 DevOps 和 CI/CD 在静态网站场景中的应用有了更深的理解。 核心体会 1. 工具链选择至关重要 这次项目使用了 GitHub Actions GitHub Pages&#xff0c;这个组…...

从零粉丝到行业KOL,ChatGPT驱动的LinkedIn内容矩阵搭建全链路,含17个已验证Prompt模板+3类避坑清单

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从零粉丝到行业KOL的底层认知跃迁 成为技术领域有影响力的声音&#xff0c;从来不是靠日更三篇“速成教程”&#xff0c;而是源于对价值创造逻辑的重构。当多数人还在纠结“选什么平台”“起什么昵称”…...

物联网安全创业:从技术挑战到市场机遇的深度解析

1. 物联网安全创业的“冷”与“热”&#xff1a;一个从业者的深度观察作为一名在嵌入式系统和网络安全领域摸爬滚打了十几年的工程师&#xff0c;我几乎见证了物联网从概念炒作到遍地开花的全过程。每次和同行、投资人聊天&#xff0c;话题总绕不开两个极端&#xff1a;一边是对…...

Python蒙特卡洛树搜索实战:手把手教你调参,让黑白棋AI从‘菜鸟’变‘高手’

Python蒙特卡洛树搜索实战&#xff1a;从调参到策略优化的完整指南 蒙特卡洛树搜索&#xff08;MCTS&#xff09;作为近年来最成功的游戏AI算法之一&#xff0c;已经在围棋、黑白棋等策略游戏中展现出惊人的实力。但很多开发者在实现基础版本后&#xff0c;常常陷入性能瓶颈——…...