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

C语言之内存函数篇(3)

目录

memcpy

memcpy的使用

memcpy的模拟实现

NO1.

NO2. 

memcpy可否实现重叠空间的拷贝

my_memcpy 

memcpy 

memmove 

memmove

memmove

分析

代码

memset

memset的使用

memcmp

memcmp的使用 

<0

=0

>0 


今天我们继续介绍几个重要的内存操作函数。🙂🙂🙂

在前面一章我们学过strcpy,strcmp等字符串函数,那这里我们来学习与它们功能类似的内存函数。

还是从参数,返回值,头文件,模拟实现等方面来讲解 

memcpy

memcpy - C++ Reference 

 memcpy与strcpy是类似的,但是strcpy仅仅用在字符串拷贝上,内存中的数据,不仅仅是字   符,还有整型,浮点型等等,这里就要用到我们的memcpy

void * memcpy ( void * destination, const void * source, size_t num );
  • memcpy是库函数,从source的位置开始向后拷贝num个字节的数据到desitination的内存位置
  •  C语言标准值规定,memcpy来实现不重叠的内存的拷贝。memcpy达到60分可以实现功能
  •  在我们VS2022这个环境中,memcpy也可以实现重叠内存的拷贝。此时memcpy达到100分
  • 头文件#include<string.h>
  • 参数size_t num是拷贝的字节个数
  • 参数const void * source 是拷贝的字节的起始位置(const防止source修改,void*类型)
  • 参数void * destination 是拷贝到的空间的起始位置(void*类型)
  • 返回类型void *
  • void*类型表示可以接收任何类型的数据,但是不能 解引用 哦
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的 
  • memcpy的模拟实现

memcpy的使用

#include<stdio.h>
int main()
{int a[] = { 0 };int b[] = { 6,7,8,9,10 };//5✖4void* p = memcpy(a, b, 20);int i = 0;for (i = 0; i < 5 ;i++){printf("%d ", a[i]);}return 0;
}

 

  • 这下无论是什么类型的数据都可以从一个空间拷贝到另外一个空间里去。 

memcpy的模拟实现

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* destination, const void* source, size_t num)//记住num是字节的个数
{assert(dest && src);void* ret = destination;while (num--){*((char*)destination) = *((char*)source);(char*)destination = (char*)destination + 1;(char*)source = (char*)source + 1;}return ret;
}
int main()
{int a[20] = { 0 };int b[] = { 1,2,3,4,5 };//5✖4void* p = my_memcpy(a, b, 20);int i = 0;for (i = 0; i < 5 ;i++){printf("%d ", a[i]);}return 0;
}

 

NO1.

有同学说可以直接一个整型一个整型的拷贝过去,但是问题在于编写库函数的程序员并不会知道我们需要拷贝怎样的类型数据,所以这里我们又可以用到回调函数当时使用的一个方法 

回调函数------->

C语言之指针进阶篇(3)_唐棣棣的博客-CSDN博客 

 

 

NO2. 

*((char*)destination) = *((char*)source);
(char*)destination++;
(char*)source++;

 那有同学这样写可以吗?

 答:当然是不可以的啦。其实关于前置和后置++我们都尽量少去使用。  因为副作用很多。我们也不清楚它的能使用的情况是怎样一回事,所以尽量少用。这里不能使用的原因是:destinationsource强制转化后,再去++,强制转化已经失效了,++时destinationsource已经变成void*类型的啦

++(char*)destination;
++(char*)source;

 虽然以上写法可能可以,但是会存在无法编译的问题。

还有同学问就不能直接++? 

 答:当然不行。回调函数我们那篇博文我们已经讲解过 void*类型的指针变量不能解引用和            计算++ --等等。

memcpy可否实现重叠空间的拷贝

当我们学习了上面memcpy的知识了,有人就动了动自己的小脑袋。🙂🙂

memcpy真的不能实现重叠内存的拷贝吗?

my_memcpy 

#include<stdio.h>
void* my_memcpy(void* destination, const void* source, size_t num)//记住num是字节的个数
{void* ret = destination;while (num--){*((char*)destination) = *((char*)source);destination = (char*)destination + 1;source = (char*)source + 1;}return ret;
}
int main()
{int b[] = { 1,2,3,4,5 };//把1 2 3拷贝到3 4 5void* p = my_memcpy(b+2, b, 12);int i = 0;for (i = 0; i < 5 ;i++){printf("%d ", b[i]);}return 0;
}

那问题到底出现在那里呢?

 

memcpy 

int main()
{int b[] = { 1,2,3,4,5 };//把1 2 3拷贝到3 4 5void* p = memcpy(b+2, b, 12);int i = 0;for (i = 0; i < 5 ;i++){printf("%d ", b[i]);}return 0;
}

 

综上所述:事实证明只是我们my_memcpy不可以。

 C语言标准值规定,memcpy来实现不重叠的内存的拷贝。memcpy达到60分可以实现功能

 在我们VS2022这个环境中,memcpy也可以实现重叠内存的拷贝。此时memcpy达到100分

 C语言标准值规定,memmove来实现重叠的内存拷贝。 

memmove 

使用memmove是否可以实现?

//当然可以
int main()
{int b[] = { 1,2,3,4,5 };//把1 2 3拷贝到3 4 5void* p = memmove(b+2, b, 12);int i = 0;for (i = 0; i < 5 ;i++){printf("%d ", b[i]);}return 0;
}

 

memmove

memmove - C++ Reference (cplusplus.com)

void * memmove ( void * destination, const void * source, size_t num );
  •  C语言标准值规定,memcpy来实现不重叠的内存的拷贝。memcpy达到60分可以实现功能
  •  在我们VS2022这个环境中,memcpy也可以实现重叠内存的拷贝。此时memcpy达到100分
  •  C语言标准值规定,memmove来实现重叠的内存拷贝。
  • memmove也是是库函数,类似memcpy,基本一致所不在详细介绍。
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
  • memmove的模拟实现

memmove

分析

代码

memset

memset - C++ Reference (cplusplus.com) 

void * memset ( void * ptr, int value, size_t num );
  • memset是库函数,是设置内存的,是以字节为单位设置内存的
  • 头文件#include<string.h>
  • 参数size_t num是设置的字节个数
  • 参数int value 是设置的字节
  • 参数void * ptr是设置的空间的起始位置(void*类型)
  • 返回类型void *
  •  void*类型表示可以接收任何类型的数据,但是不能 解引用 哦和计算++,--等
  • 准确来说memset更加适合char类型的变量,但是可以把整型设置全设为1
  • 注意char可以放到int里,int不能放到char里

memset的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "tsqxgd.haha";memset(arr+6, 'x', 3);//再次强调是3个字节printf("%s\n", arr);
}

 

memcmp

memcmp - C++ Reference (cplusplus.com)

int memcmp ( const void * ptr1,const void * ptr2,size_t num );
  • memcmp是库函数,是比较内存的,是以字节为单位比较内存的
  • 比较从ptr1和ptr2指针开始的num个字节
  • 头文件#include<string.h>
  • 参数size_t num是设置的字节个数
  • 参数const void * ptr1 是比较的字节的起始位置(const防止source修改,void*类型)
  • 参数const void * ptr2 是比较的空间的起始位置(void*类型)
  •  void*类型表示可以接收任何类型的数据,但是不能 解引用 哦和计算++,--等
  • 返回类型int 
  •  返回值如下图:

memcmp的使用 

<0

#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,2,3,4,6 };int ret = memcmp(arr1, arr2, 20);printf("%d\n", ret);
}

 

=0

#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,2,3,4,6 };int ret = memcmp(arr1, arr2, 16);printf("%s\n", ret);
}

 

>0 

#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,7 };int arr2[] = { 1,2,3,4,6 };int ret = memcmp(arr1, arr2,20 );printf("%d\n", ret);
}

 

特别提醒:

只是在vs2022编译器下,才是0,1,-1这样的数值,

在其他编译器下可能就不是但是肯定是<0 >0 =0这样的范围的。 

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!

我知青山不复在,也知绿水难长流。

下篇博文我们总结各种函数的模拟实现。🆗🆗🆗🆗走的每一步都是算数的。

代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】

联系------→【邮箱:2784139418@qq.com】

相关文章:

C语言之内存函数篇(3)

目录 memcpy memcpy的使用 memcpy的模拟实现 NO1. NO2. memcpy可否实现重叠空间的拷贝 my_memcpy memcpy memmove memmove memmove 分析 代码 memset memset的使用 memcmp memcmp的使用 <0 0 >0 今天我们继续介绍几个重要的内存操作函数。&…...

java面试题-学成在线项目

1、详细说说你的项目吧 从以下几个方面进行项目介绍&#xff1a; 1、项目的背景&#xff0c;包括&#xff1a;是自研还是外包、什么业务、服务的客户群是谁、谁去运营等问题。 2、项目的业务流程 3、项目的功能模块 4、项目的技术架构 5、个人工作职责 6、个人负责模块的详细说…...

ViewBinding——Android之视图绑定

高版本的gradle不再支持 kotlin-android-extensions插件&#xff0c;因此view的绑定方式也有所改变。 1.启用视图绑定 android {...viewBinding {enabled true}} 如果想在生成绑定类时忽略某个布局文件&#xff0c;请将 tools:viewBindingIgnore"true" 属性添加到…...

vue学习-04vue的props配置项和mixin混入

今天仍然就是敲vue的一个demo&#xff0c;vue的props配置项和mixin混入 props配置项 Vue.js 中的 props 是用于在父组件向子组件传递数据的配置项。通过 props&#xff0c;你可以将父组件中的数据传递给子组件&#xff0c;并在子组件中使用这些数据。以下是关于 props 配置项…...

九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)

Multinomial Naive Bayes&#xff1a;用于多项式模型的Naive Bayes分类器 一、算法思路 多项式Naive Bayes分类器适用于离散特征分类&#xff08;如文本分类中的字数&#xff09; 多叉分布通常需要整数特征计数 不过&#xff0c;在实际应用中&#xff0c;分数计数&#xff08…...

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录 单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数&#xff0c;设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数&…...

如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?

众所周知&#xff0c;规范着装在很多场景中起着重要的作用。违规着装极易增加安全隐患&#xff0c;并且引发安全事故和质量问题&#xff0c;例如&#xff0c;在化工工厂中&#xff0c;倘若员工没有穿戴符合要求的特殊防护服和安全鞋&#xff0c;将有极大可能受到有害物质的侵害…...

C语言自定义类型(上)

大家好&#xff0c;我们又见面了&#xff0c;这一次我们来学习一些C语言有关于自定义类型的结构。 目录 1.结构体 2位段 1.结构体 前面我们已经学习了一些有关于结构体的知识&#xff0c;现在我们进行深入的学习有关于它的知识。 结构是一些值的集合&#xff0c;这些值称为…...

Python - 小玩意 - 圣诞树背景音乐弹窗

import turtle as t import tkinter as tk import pygame import random as r import threading import time# 初始化背景音乐 def initialize_music():file r"./music/周杰伦-蜗牛.mp3"pygame.mixer.init()pygame.mixer.music.load(file)pygame.mixer.music.play()…...

The 2023 ICPC Asia Regionals Online Contest (1) E. Magical Pair(数论 欧拉函数)

题目 T(T<10)组样例&#xff0c;每次给出一个n(2<n<1e18)&#xff0c; 询问多少对&#xff0c;满足 答案对998244353取模&#xff0c;保证n-1不是998244353倍数 思路来源 OEIS、SSerxhs、官方题解 2023 ICPC 网络赛 第一场简要题解 - 知乎 题解 官方题解还没有…...

<十三>objectARX开发:模拟实现CAD的移动Move命令

一、目的 实现类似于CAD的移动命令,选择对象,移动到指定位置,移动过程中对象跟随鼠标移动。效果如下: 二、关键步骤 选择对象,打开实体判断类型:acedEntSel()、acdbOpenObject()、isKindOf()。指定基点:acedGetPoint()。移动模型,追踪光标移动对象实体:acedGrRead()…...

Autosar基础:模式管理-EcuM

ECUM目录 前言一、ECUM状态机二、Fixed和Flexible模式的区别与联系三、状态详解3.1.Startup3.2.UP3.3.RUN3.4.Sleep3.5.Shutdown三、EcuM唤醒源3.1 CAN Trcv唤醒3.2 唤醒后操作前言 根据Autosar对于模式管理的需求定义,模式管理有以下模块: ①ECU State Manager(EcuM):管理…...

代码随想录Day42 | 01背包问题| 416. 分割等和子集

01背包问题&#xff08;Acwing&#xff09; 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入…...

UML六大关系总结

UML六大关系有&#xff1a;继承、关系、聚合、组合、实现、依赖。分为通过图和代码总结这些关系。 1、继承 继承&#xff08;Inheritance&#xff09;&#xff1a;表示类之间的继承关系&#xff0c;子类继承父类的属性和方法&#xff0c;并可以添加自己的扩展。 继承&#x…...

ElementUI基本介绍及登录注册案例演示

目录 前言 一.简介 二.优缺点 三.Element完成登录注册 1. 环境配置及前端演示 1.1 安装Element-UI模块 1.2 安装axios和qs(发送get请求和post请求) 1.3 导入依赖 2 页面布局 2.1组件与界面 3.方法实现功能数据交互 3.1 通过方法进行页面跳转 3.2 axios发送get请求 …...

Python爬虫-某网酒店评论数据

前言 本文是该专栏的第6篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某网的酒店数据为例,采集对应酒店的评论数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 注意:本文的案例“数据集”,选用的是本专栏上一篇“Python爬虫-某网酒店数…...

C# Onnx Yolov8 Detect 水果识别

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...

测试网页调用本地可执行程序(续1:解析参数中的中文编码)

学习测试网页调用本地可执行程序还遗留一个问题&#xff0c;即网页中调用带中文参数的命令时&#xff0c;本地可执行程序接收到的参数字符串里的中文都转换成了编码模式&#xff0c;看起来如下所示&#xff1a; <a href TestPageCall:-a你好>启动测试程序</a><…...

C++入门知识

Hello&#xff0c;今天我们分享一些关于C入门的知识&#xff0c;看完至少让你为后面的类和对象有一定的基础&#xff0c;所以在讲类和对象的时候&#xff0c;我们需要来了解一些关于C入门的知识。 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对…...

spring和springmvc常用注解

1.Spring常用注解&#xff1a; 1&#xff09;Repository将DAO类声明为Bean 2&#xff09;Service用于修饰service层的组件 3&#xff09;Controller通常作用在控制层&#xff0c;将在Spring MVC中使用 4&#xff09;Component是一个泛化的概念&#xff0c;仅仅表示spring中的一…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...