裤裤带你一起学C语言内存函数啦!

目录

1.memcpy的使用和模拟实现

2.memmove使用和模拟实现

3.memset函数的使用

4.memcmp函数的使用


内存函数在<string.h>库中,我们使用内存函数必须先引入<string.h>头文件

1.memcpy的使用和模拟实现

memcpy的函数原型如下:

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

1.函数memcpy会从source的位置开始向后复制num个字节到destination中。

2.这个函数在遇到’\0‘时并不会停下来

3.如果两块内存有重叠的话,复制的结果是未定义的。

我们先来使用以下这个函数看看效果。

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };int arr3[10] = { 0 };int arr4[10] = { 0 };int i = 0;memcpy(arr2, arr1, 8);for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}printf("\n");memcpy(arr3, arr1, 10);for (i = 0; i < 10; i++){printf("%d ", arr3[i]);}printf("\n");memcpy(arr4, arr1, 20);for (i = 0; i < 10; i++){printf("%d ", arr4[i]);}printf("\n");return 0;
}

运行结果: 

1 2 0 0 0 0 0 0 0 0
1 2 3 0 0 0 0 0 0 0
1 2 3 4 5 0 0 0 0 0

大家一定要注意,这里操作的是字节,而一个字节是八个比特位。 

现在我们来模拟实现一下这个函数

void* memcpy(void* dst, const void* src, size_t count)
{assert(src);assert(dst);void* ret = dst;while (count--){*(char*)dst= *(char*)src;dst =(char*)dst + 1;src =(char*)src + 1;}return ret;
}

但是,如果两个内存块重叠的话,我们使用这个函数就无法完成我们的目的了,我给大家展示一下

为了避免出现这样的情况,我们就需要使用memmove来进行操作了。

2.memmove使用和模拟实现

memmove和memcpy的差别就是memmove函数处理的源内存块是可以和目标内存块重叠的。

那么我们又应该怎么去复制呢?诸君且看图!

void* memmove1(void* dst, const void* src, size_t count)
{void* ret = dst;//情况2,情况3if (dst <= ret || (char*)dst >= ((char*)src + count)){while (count--){*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}//别的情况都可以从高地址复制到低地址解决问题else{//我们如果不-1,就会比count多复制一个字节。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;
}

 再画个图帮助大家理解为什么要-1.

3.memset函数的使用

memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

这个函数的原型如下:

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

ptr是要设置的内存地址

value是要设置的值

num是该值的字节数。

如下图所示:

4.memcmp函数的使用

这是一个内存比较函数,函数原型如下:

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

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

比较的原理和返回值可参考这篇博文目录6:C语言字符串函数全解!

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

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

相关文章

Vue--》深入了解 VueUse 功能性工具集

今天博主为大家介绍一款实用性的插件名字叫做 VueUse &#xff0c;它是专门为 Vue.js 生态系统设计的功能性工具集合。其提供了许多可重用的功能函数&#xff0c;可以帮助开发者更轻松地构建 Vue.js 应用程序。其提供了大量的功能&#xff0c;包括状态管理、副作用管理、组合式…

【刷题】前缀和入门

送给大家一句话&#xff1a; 既然已经做出了选择&#xff0c;最好还是先假定自己是对的。焦虑未来和后悔过去&#xff0c;只经历一个就够了。 – 张寒寺 《不正常人类症候群》 ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ…

react引入iconfont的svg图标

react引入iconfont的svg图标 本文目录 react引入iconfont的svg图标普通图标通过link引入css组件内引入css使用 svg图标通过script引入js组件内引入js使用 通过封装组件自定义封装组件中调用 通过antd封装使用 普通图标 通过link引入css <link rel"stylesheet" h…

基于springboot实现在线考试系统设计【项目源码+论文说明】计算机毕业设计

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…

http 3.0 有哪些新特性

HTTP/3 是超文本传输协议&#xff08;HTTP&#xff09;的最新主要版本&#xff0c;其显著特点是放弃了传统的TCP作为传输层协议&#xff0c;转而采用基于UDP的QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议。以下是HTTP/3利用QUIC实现高性能传输的关键特性&…

【Linux】【开发】如何确认C语言中的某个宏是否已生效

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…

sketchup{su}安装错误1402

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功既可尝试重新安装su 软件每周六选择其他方式登录免费使用

微软github技术公开课(web开发、生成式AI、ML、数据科学、物联网)

一些微软在github上公开的课程整理&#xff1a; web开发基础入门 面向初学者的数据数据科学课程 https://microsoft.github.io/Data-Science-For-Beginners/#/ 面向初学者的AI入门课程 https://github.com/microsoft/ai-for-beginners 面向初学者的生成式AI课程 https://…

WordPress自动采集发布AutoPostPro汉化版插件

WP-AutoPostPro 是一款极为出色的WordPress自动采集发布插件&#xff0c;其显著优势在于能够从任何网站抓取内容并自动将其发布到你的WordPress网站上。它实现了对任何网页内容的自动采集和发布&#xff0c;整个采集过程完全自动化&#xff0c;无需手动操作。 项 目 地 址 &…

python多个自己写的py文件打包成一个可执行

python多个自己写的py文件打包成一个可执行 在Python中&#xff0c;可以使用PyInstaller或cx_Freeze等工具将多个文件打包成一个可执行文件。以下是使用PyInstaller的基本步骤&#xff1a; 1.安装PyInstaller: pip install pyinstaller 2.在命令行中使用PyInstaller创…

网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)

网络互连 网络互连: 将多台计算机连接在一起, 完成数据共享 数据共享的本质是网络数据传输, 即计算机之间通过网络来传输数, 也叫做网络通信 根据网络互连的规模不同, 将网络划分为局域网和广域网 注意: 局域网和广域网是相对的概念 局域网LAN 又称内网, 局域网和局域网之间在没…

生成式AI在B端产品的应用分析

AI产品发展到现在&#xff0c;消费端的产品应用还受到比较大的限制&#xff1b;但是在B端&#xff0c;已经有了不错的表现。作者总结了AI产品在B端的几款应用&#xff0c;一起来看看表现如何。 生成式AI在B端产品的应用分析© 由 ZAKER 提供 随着今年生成式AI应用的大范围…

Python基础06-日期和时间的操作方法

在Python中处理日期和时间是编程中常见的需求&#xff0c;无论是安排任务、记录日志还是分析数据。本文将介绍如何在Python中获取当前日期和时间、创建特定日期和时间、格式化日期和时间、解析字符串中的日期和时间、使用时间差、比较日期和时间、从日期/时间中提取组件、处理时…

2024年Java接单平台强力推荐!各个都知名!

Java这几年真卷飞了&#xff0c;一点都不夸张。因此&#xff0c;很多程序员朋友都已经试着转方向、换赛道了。试着接单、找私活就是一大途径。当然&#xff0c;特别是有技术、又有相对空闲时间的朋友&#xff0c;更值得一试。既是增加收入的捷径&#xff0c;又可以提升自我——…

在Milk-v Duo上部署YOLOV8模型

建议自己编译images固件&#xff0c;我使用官方给的固件在部署中出现了一些问题&#xff0c;请参考: 编译Milkv-duo固件-CSDN博客 下载YOLOv8 git clone https://github.com/ultralytics/ultralytics.git 下载yolo_export.zip 下载链接&#xff1a;链接&#xff1a;百度网盘…

前端this指向问题

在前端开发中&#xff0c;this 的指向取决于函数的调用方式。在全局作用域中&#xff0c;this 指向 window 对象。在对象方法中&#xff0c;this 指向调用该方法的对象。箭头函数中的 this 指向定义时的上下文&#xff0c;而不是调用时的上下文。 在函数中&#xff0c;this 的…

quivr部署

安装supabase https://zcywxy.blog.csdn.net/article/details/137496929 安装nginx并配置反向代理 location /authend {rewrite ^/authend(/.*)$ $1 break; # 去掉 URL 中的 /backendproxy_pass http://localhost:54321; # 将请求转发到本地的 5050 端口proxy_http_version 1.…

嵌入式软件学习进阶

嵌入式软件是指嵌入到设备或系统中的软件&#xff0c;具有实时性、稳定性和高效性等特点。想要学习嵌入式软件的进阶知识&#xff0c;可以从以下几个方面入手&#xff1a; 1. 硬件知识&#xff1a;了解嵌入式系统的硬件结构和工作原理&#xff0c;学习电路设计、模拟和数字电子…

mysql常见语法操作笔记

1. 数据库的基本操作 1.1. MYSQL登录与退出 D:\phpstudy_pro\Extensions\MySQL5.7.26\bin 输入 mysql -uroot -proot -h127.0.0.1 退出的三种方法 mysql > exit; mysql > quit; mysql > \q; 1.2. MYSQL数据库的一些解释 注意&#xff1a;数据库就相当于文件夹 …

XiaodiSec day034 Learn Note 小迪安全学习笔记

XiaodiSec day034 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day34 黑盒审计和白盒审计 与 cms 相关 .net java php 代码审计 开始 黑盒&#xff1a;找文件上传的功能 个人用户中心是否存在文件上传功能后台管理系统是否存在文件上传功能字典目录…