C语言——内存函数【memcpy,memmove,memset,memcmp】

news2024/9/24 13:17:57

📝前言:
在之前的文章C语言——字符函数和字符串函数(一)中我们学习过strcpystrcat等用来实现字符串赋值和追加的函数,那么除了字符内容,其他的数据(例如整型)能否被复制或者移动呢
答案是:可以的!

这篇文章我们就来学习一下C语言内存函数
1,memcpy
2,memmove
3,memset
4,memcmp

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:慕强,所以要变得更强


文章目录

  • 一,memcpy
    • 1,基本介绍
    • 2,使用实例
  • 二,memmove
    • 1,基本介绍
    • 2,使用实例
  • 三,memset
    • 1,基本介绍
    • 2,使用实例
  • 四,memcmp
    • 1,基本介绍
    • 2,使用实例

一,memcpy

1,基本介绍

我们先看C library对它的介绍👇🏻
在这里插入图片描述
🔍重点提取:
①所在头文件:string.h
②函数原型:
void * memcpy ( void * destination, const void * source, size_t num );
destination(目标空间),source(源头),num(字节个数)
③函数功能:
●从source指向的位置开始向后复制num个字节的数据到destination指向的位置
④注意:
●函数在遇到\0的时候不会停止
●如果要复制num个字节,那么source和destination的数组大小至少为num字节
●如果source和destination的内存块有重叠,那复制的结果是未定义的(有重叠的时候,最好用memmove)

2,使用实例

假如我们要把整型数组arr1中的前五个数复制到arr2中:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1,5*sizeof(int)); //复制5个整型(共20个字节)
	//打印arr2 观察结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

输出结果👇🏻
在这里插入图片描述
可以发现:数组arr1的前五个数据,被复制到了arr2前五个数据的位置

二,memmove

1,基本介绍

那么前面所提到的内存块重叠,例如:

arr1 [10] = {0,1,2,3,4,5,6,7,8,9};
我们希望把arr1中的2,3,4复制到3,4,5的位置,即变成:
arr1 [10] = {0,1,2,2,3,4,6,7,8,9}

面对内存有重叠时,我们不使用memcpy,而应该使用memmove👇🏻
在这里插入图片描述
🔍
●功能:
从source指向的位置开始向后复制num个字节的数据到destination指向的位置(是不是感觉和memcpy一样)
so👇🏻
●区别:
memmove函数可以用来处理源内存块和目标内存块重叠的情况

2,使用实例

假如我们还是要实现:

arr1 [10] = {0,1,2,3,4,5,6,7,8,9};
我们希望把arr1中的2,3,4复制到3,4,5的位置,即变成:
arr1 [10] = {0,1,2,2,3,4,6,7,8,9}

则👇🏻

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	memmove(arr1+3, arr1+2,3*sizeof(int)); 
	//从arr1+2的位置开始,往后面复制3个整数到arr1+3
	//打印arr1 观察结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

输出结果:
在这里插入图片描述

三,memset

1,基本介绍

在这里插入图片描述
🔍重点提取:
①所在头文件:string.h
②函数原型:
void * memset ( void * ptr, int value, size_t num );
ptr(要设置的内存),value(要赋的值),num(字节个数)
③函数功能:
将ptr指向的内存的前num个字节设置成value
④注意:
●这个函数是一个字节一个字节的改

2,使用实例

假如我们要把hello world的前5个字节改成x👇🏻

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "hello world";
	memset(str, 'x', 5);
	printf(str);
	return 0;
}

输出结果:
在这里插入图片描述

假如我们要改整型数组:
arr[5] = {1,2,3,4,5};的前2个数字改成0👇🏻

#include<stdio.h>
#include<string.h>
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	memset(arr, 0, 2*sizeof(int));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

输出结果:
在这里插入图片描述

四,memcmp

1,基本介绍

在这里插入图片描述
●函数原型:int memcmp ( const void * ptr1, const void * ptr2, size_t num );
●功能:从ptr1和ptr2指向的位置开始,向后比num个字节
●比较方法及返回:(和strncmp类似)strncmp是一个一个字符的比,memcmp是一个一个字节的比(可以比较其他类型的数据,适用范围更广)
【如果有不知道如何比较的,可以看C语言——字符函数和字符串函数(二)里面对strcmp的比较的讲解】

2,使用实例

我们来比较几个整型数组👇🏻
在这里插入图片描述

输出结果:
在这里插入图片描述

注意:
比较的时候num不要超过数组自身的大小
如:arr1和arr3比16个字节,这是有问题的。因为arr3只存放了3个整数,最多比12个字节


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

Linux centos stream9 parted

在Linux中&#xff0c;常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉&#xff0c;是过去我们使用windows时常见的。所支持的最大卷2T&#xff0c;且对分区有限制&#x…

微信号一天能加多少个好友?

微信的风控措施日益严格&#xff0c;因其本身是一款社交软件&#xff0c;却因流量巨大而被用于营销。若借助微信进行营销&#xff0c;仅依靠一个微信号&#xff0c;每日发送好友验证上限仅为20个&#xff08;针对老号&#xff09;&#xff0c;最佳数量控制在15个以内&#xff0…

DolphinScheduler伪集群部署

一.伪集群部署 伪集群部署目的是在单台机器部署 DolphinScheduler 服务&#xff0c;该模式下master、worker、api server、logger server都在同一台机器上。单机版本稳定性较差&#xff0c;官方建议20个以下流程使用。 二.前置需求 &#xff11;、&#xff12;.&#xff10;.…

Nightingale 夜莺监控系统 - 告警篇(3)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/usage/alert/alert-rule/ 目录 前言一、配置1.1 创建钉钉机器人1.2 n9e 创建通知用户1.3 n9e 创建团队&#xff08;组&#xff09;1.4 将通知用户添加团队1.…

Python自动化我选DrissionPage,弃用Selenium

DrissionPage 是一个基于 python 的网页自动化工具。 它既能控制浏览器&#xff0c;也能收发数据包&#xff0c;还能把两者合而为一。 可兼顾浏览器自动化的便利性和 requests 的高效率。 它功能强大&#xff0c;内置无数人性化设计和便捷功能。 它的语法简洁而优雅&#x…

玩转Mysql 五(MySQL索引)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、索引的数据结构 1、MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是…

【动态规划】【记忆化搜索】C++算法:546移除盒子

作者推荐 【动态规划】458:可怜的小猪 本文涉及知识点 动态规划 记忆化搜索 LeetCode546. 移除盒子 给出一些不同颜色的盒子 boxes &#xff0c;盒子的颜色由不同的正数表示。 你将经过若干轮操作去去掉盒子&#xff0c;直到所有的盒子都去掉为止。每一轮你可以移除具有相…

请查收“链上天眼”2023年成绩单

1月10日是中国人民警察节&#xff0c;是一份责任&#xff0c;更一份安心&#xff0c;随着科技的发展&#xff0c;链上安全领域的技术与工具不断更新迭代&#xff0c;更加安全的Web3世界正在构建。 根据欧科云链安全团队统计&#xff0c;2023 年全球范围内利用虚拟货币进行诈骗…

程序员如何弯道超车?周末有奇效

作为一名程序员&#xff0c;不断提升自己的技能和知识是至关重要的。然而&#xff0c;在繁忙的工作日常中&#xff0c;很难有足够的时间和精力来学习新技术或深入研究。因此&#xff0c;周末成为了一个理想的时机&#xff0c;可以专注于个人发展和技能提升。所以程序员如何利用…

QT周五作业

题目&#xff1a;实现简单水果的价格重量计算 点击一次水果重量1 自动计算总价 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QListWidgetItem> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

从零开发短视频电商 PaddleOCR Java推理 (一)飞桨引擎推理

文章目录 简介方式一&#xff1a;DJL 飞浆引擎 飞桨模型方式二&#xff1a;ONNXRuntime 飞桨转换后的ONNX模型&#xff08;Paddle2ONNX&#xff09; 添加依赖文字识别OCR过程分析文字区域检测文字角度检测文字识别&#xff08;裁减旋转后的文字区域&#xff09; 高级替换模型…

【PHP AES加解密示例】从入门到精通,一篇文章让你掌握加密解密技术!

一、引言 随着互联网的普及&#xff0c;数据安全问题越来越受到人们的关注。在众多加密算法中&#xff0c;AES&#xff08;Advanced Encryption Standard&#xff09;因其高效、安全的特点被广泛应用。本文将通过PHP语言&#xff0c;为大家展示一个简单的AES加解密示例&#x…

Javaweb的网络投票系统的设计与实现

目的与意义 原始的投票管理基本上是人工操作&#xff0c;效率低下&#xff0c;缺乏方便性&#xff0c;网上投票管理系统运用计算机和其他附加设备&#xff0c;不再需要手工操作&#xff0c;基本上是全自动化&#xff0c;能够节省人力&#xff0c;大大的提高了效率。使投票变得…

ChromeDriver 添加到系统PATH

在软件测试和自动化脚本中&#xff0c;ChromeDriver是一个不可或缺的工具。为了方便使用&#xff0c;将其添加到系统PATH中是一个明智的选择。以下是在Windows、macOS或Linux上完成此任务的详细步骤。 在 Windows 上&#xff1a; 下载并保存 ChromeDriver&#xff1a; 访问Chro…

【学习】FPGA verilog 编程使用vscode,资源占用多 卡顿 卡死 内存占用多解决方案

问题描述 FPGA verilog 编程使用vscode&#xff0c;资源占用多 卡顿 卡死 内存占用多解决方案。 32G内存&#xff0c;动不动就暂用50%&#xff01;&#xff01; 解决方案 1.打开设置 文件->首选项->设置 或者点击软件界面的左下角的齿轮按钮 2.进入如下【设置】界面 …

springcloud-cloud provider-payment8001微服务提供者支付Module模块

文章目录 IDEA新建project工作空间cloud-provider-payment8001微服务提供者支付Module模块建表SQL测试 IDEA新建project工作空间 微服务cloud整体聚合父工程Project 写pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"htt…

JVM知识总结(持续更新)

这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区 java内存区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域&#xff1a; 程序计数器虚拟机栈本地方法栈堆方法区 程序计数器 记录下一条需要执行的虚拟机字节码指令…

安全漏洞周报(2024.01.01-2023.01.08)

漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍&#xff1a; 某友CRM系统是一款综合性的客户关系管理软件&#xff0c;旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能&#xff0c;包括销售管理、市场营销、客户服…

【前后端的那些事】treeSelect树形结构数据展示

文章目录 tree-selector1. 新增表单组件2. 在父组件中引用3. 父组件添加新增按钮4. 树形组件4.1 前端代码4.2 后端代码 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c…

(十一)IIC总线-AT24C02-EEPROM

文章目录 IIC总线篇AT24C02-EEPROM篇主要特性引脚说明AT24Cxx用几位数据地址随机寻址的(存储器组织)AT24C02设备操作AT24CXX设备寻址EEPROM写操作的种类EEPROM读操作的种类实现单字节写实现任意读读写应用 IIC总线篇 前面介绍过了&#xff0c;请参考 (十)IIC总线-PCF8591-ADC/…