详解4大C语言内存函数【超详细建议点赞收藏】

目录

  • 1. memcpy----内存拷贝
    • 1.1 函数介绍
    • 1.2 函数使用
    • 1.3 模拟实现
  • 2. memmove----重叠内存的数据拷贝
    • 2.1 函数介绍
    • 2.2 函数使用
    • 2.3 模拟实现
  • 3. memcmp----内存比较
    • 3.1 函数介绍
    • 3.2 函数使用
  • 4.memset----内存设置
    • 4.1 函数介绍
    • 4.2 函数使用

注意:以下4个内存函数在使用时都要引用头文件<string.h>

1. memcpy----内存拷贝

1.1 函数介绍

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/aa0f1f6ff11a4f7b985ae91cade927c6.png

  • 参数类型与返回值类型都是void* ,这是因为这个函数不仅可以拷贝字符串,也可以拷贝整型,浮点型等,所以需要泛型指针接收。(注:若想了解void* 指针的使用,请移步我的主页浏览文章《深入理解指针变量》)
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
  • 注意:这个函数只负责拷贝两块独立空间的数据。(事实上我们在VS2022上用这个函数进行重叠内存的拷贝是可以编译成功的,但是一般不用来处理重叠内存的拷贝,会有专门的memmove函数实现

1.2 函数使用

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

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

如果我们进行重叠内存的拷贝:

#include <stdio.h>
#include <string.h>int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };//int arr2[10] = { 0 };memcpy(arr1, arr1+3, 20);//把arr1中的45678拷贝(重叠覆盖)到1234int i = 0;for (i = 0; i <10 ; i++){printf("%d ", arr1[i]);}return 0;
}

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

1.3 模拟实现

#include <stdio.h>
#include <assert.h>void* my_memcpy(void* dest,const void* src, size_t num)
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest = *(char*)src;src = (char*)src+1;dest = (char*)dest + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 24);int i = 0;for (i = 0; i < 6; i++){printf("%d ", arr2[i]);}return 0;
}

2. memmove----重叠内存的数据拷贝

2.1 函数介绍

在这里插入图片描述

  • 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
  • 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

2.2 函数使用

#include <stdio.h>
#include <string.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 2, arr, 24);//把arr中的123456拷贝(覆盖)到345678int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

输出结果:

在这里插入图片描述

2.3 模拟实现

#include <stdio.h>
#include <assert.h>void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);void* ret = dest;if (dest < src){//前->后while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{//后->前while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr , arr+2, 24);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

3. memcmp----内存比较

3.1 函数介绍

在这里插入图片描述

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

3.2 函数使用

#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5 };//00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05int arr2[] = { 1,3,5 };    //00 00 00 01 00 00 00 03 00 00 00 05int ret = memcmp(arr1, arr2,12);printf("%d\n", ret);return 0;
}

比较的内存状况:
在这里插入图片描述

4.memset----内存设置

4.1 函数介绍

在这里插入图片描述

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

4.2 函数使用

  1. 正确使用
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";memset(arr, 'z', 4);printf("%s\n", arr);return 0
}

把字符数组arr中的4个字节设置成字符z。
输出结果:

在这里插入图片描述

  1. 错误使用

有些人想使用memset函数把整型数组初始化成1?
这是错误的!!
因为memset函数设置的是字节,是把内存中的该数组的所有字节变为1,打印出来是一个非常大的数字,不能把整型数组初始化为1。

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

输出结果:

在这里插入图片描述

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

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

相关文章

Springboot医院信息管理系统源码 带电子病历和LIS Saas应用+前后端分离+B/S架构

目录 系统特点 技术架构 系统功能 1、 标准数据维护 2、 收费&#xff08;门诊/住院&#xff09;系统 3、 药剂管理系统 4、 医生工作站系统 5、 护士工作站系统 6、电子病历系统 系统优点 云HIS系统简介 云HIS系统功能模块 门急诊挂号管理 门诊收费管理 门诊医…

ansible剧本中的角色

1 roles角色 1.1 roles角色的作用&#xff1f; 可以把playbook剧本里的各个play看作为一个角色&#xff0c;将各个角色打的tasks任务、vars变量、template模版和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理&#xff0c;在需要的时候可在playbook中使…

通过Nginx实现在浏览器查看Linux服务器日志

一、在nginx配置文件的server标签内加入以下标签和内容 location /logs {alias /data/nginx/logs;#nginx日志目录autoindex on;#打开目录浏览功能autoindex_exact_size off;#默认为on,显示出文件的确切大小,单位是bytes#显示出文件的大概大小,单位是kb或者mb或者gbautoinde…

直接选择排序算法

​​​​​​目录 选择排序 SelectSort直接选择排序 整体思路 图解分析 ​ 代码实现 时间复杂度 选择排序 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排…

【SV的面向对象 SV的类_2024.01.02】

OOP术语 OOP&#xff1a;object oriented programming Class类&#xff1a;包含变量和子程序的基本构建块 Object对象&#xff1a;类的一个实例 Handle句柄&#xff1a;指向对象的指针 Property属性&#xff1a;存储数据的变量&#xff1b;在V中&#xff0c;可以是wire或reg类…

java-场景题

1、超时关单 delayQueue 延迟队列不支持分布式RocketMQ 延迟投递Redis 设置过期时间监听过期事件定时任务&#xff08;阿里&#xff09; 定时任务搂数据库&#xff08;对数据库有压力&#xff09;超时中心 2、分布分表如何进行分页查询 采用es&#xff0c;由es完成分页查询&…

NOTA-马来酰亚胺,1295584-83-6,可作为过渡金属离子的配体

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;NOTA-马来酰亚胺&#xff0c;NOTA Maleimide &#xff0c;NOTA-Mal&#xff0c;1295584-83-6 一、基本信息 产品简介&#xff1a;NOTA Maleimide, also known as NOTA maleimide, is a novel bifunctional integrat…

【LeetCode每日一题】单调栈 402 移掉k位数字

402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k **位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 &#xff1a; 输入&#xff1a;num "1432219", k 3 输出&#xff…

Sora不懂物理世界,翻车神图全网爆笑!LeCun马斯克DeepMind大佬激辩世界模型

大火的Sora&#xff0c;让许多动画、影视行业的人大为恐慌。 不过&#xff0c;今天网上广为流传的这张图&#xff0c;让大家倒是放心了不少。 可以看到&#xff0c;在这个视频中&#xff0c;玻璃杯碎裂的方式十分诡异—— 它被抬到半空中时&#xff0c;桌子上就忽然出现了一滩…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

Vue2:Vuex中使用mapMutations和mapActions

一、情景说明 上一节&#xff0c;我们学会在vc的computed模块中&#xff0c;使用mapState和mapGetters来简化代码 这一节&#xff0c;我们学习在vc的methods模块中&#xff0c;使用mapMutations和mapActions来简化代码 在vc的methods中&#xff0c;我们会使用到store的dispat…

控制与状态机算法

控制与状态机算法是计算机科学、电子工程和自动化领域中常用的一种设计工具,它用来描述一个系统的行为,该系统在不同时间点可以处于不同的状态,并且其行为取决于当前状态以及输入的信号或事件。状态机算法的核心概念包括: 状态(State):系统的任何可能配置。每个状态代表…

【图像分割 2023 WACV】HiFormer

【图像分割 2023 WACV】HiFormer 论文题目&#xff1a;HiFormer: Hierarchical Multi-scale Representations Using Transformers for Medical Image Segmentation 中文题目&#xff1a;HiFormer:基于Transformer的分层多尺度表示医学图像分割 论文链接&#xff1a; 论文代码&a…

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式&#xff0c;通过注入代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

【使用QT遇到的小问题】

使用QT遇到的小问题 error: cannot open output file debug_0219homework.exe: Permission denied 应该是由于没关多次ctrl r 运行项目导致的&#xff0c;解决办法&#xff0c;把项目关了&#xff0c;重新开下。 0.0醉了。

Maxwell - 增量数据

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

table表格/内容等左右滑动禁止mac笔记本等自带左右滑返回功能

.el-table__body-wrapper {overscroll-behavior: contain;/* 防止滚动过头效果 */ }overscroll-behavior CSS 属性是 overscroll-behavior-x 和 overscroll-behavior-y 属性的合并写法, 让你可以控制浏览器过度滚动时的表现——也就是滚动到边界。 auto - 默认。元素的滚动会传…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中&#xff0c;CSS已经取得了长足的进步。在过去&#xff0c;您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在&#xff0c;您可以设计复杂的交互式用户界面&#xff0c;具有优雅的设计。 尽管CSS变得越来越先进&#x…

虚拟机centos7 网络IP冲突

修改其中一个虚拟机IP 1&#xff1a; 设置虚拟机网络配置器的模式为NAT模式&#xff0c;操作方式如下图所示 2&#xff1a;点击虚拟网络编辑器 3&#xff1a;点击NAT设置 4&#xff1a;点击DHCP配置 5&#xff1a; 修改配置文件来指定IP并可以连接到外网&#xff0c;在roo…