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

常见的内存操作函数

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:C语言航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注


前言

以下函数的查阅资料都在cplusplus网站

目录

  • 前言
  • 一、memcpy
      • (1)memcpy函数介绍
      • (2)memcpy函数用法
      • (3)memcpy函数模拟实现
      • (4)memcpy函数注意事项
  • 二、memmove
      • (1)memmove函数介绍
      • (2)memmove函数用法
      • (3)memmove函数模拟实现
  • 三、memcmp
      • (1)memcpy函数介绍
      • (2)memcpy函数用法
  • 四、memset函数

一、memcpy

(1)memcpy函数介绍

在这里插入图片描述

  • 功能:内存拷贝

(2)memcpy函数用法

memcpy的意义和strcpy、strncpy是一样的。
不同的是:strcpy和strncpy只能拷贝字符串,而memcpy既能拷贝字符串,也能拷贝整型等等

【拷贝整型】
在这里插入图片描述

【拷贝字符串】
在这里插入图片描述

(3)memcpy函数模拟实现

在这里插入图片描述

几个问题

  1. 函数返回类型为void*,是因为memcpy需要返回目标空间的起始地址
  2. destsrc的类型都为void*,是因为memcpy可以拷贝任意类型,而void*恰好可以结束任意类型的地址(指针)。这一块可参考qsort的模拟实现 点击跳转
  3. 由于类型不确定,所以只能一个字节一个字节交换内容,这一块同样参考qsort的模拟实现

(4)memcpy函数注意事项

  • 要保证目标空间足够大
  • 函数在遇到‘\0’的时候不会停下来
  • 如果sourcedestination有任何重叠,复制的结果是未定义
    在这里插入图片描述
    所以,如果想要重叠拷贝,需要用memmove(下面会介绍)

二、memmove

(1)memmove函数介绍

在这里插入图片描述

功能:移动内存块

(2)memmove函数用法

用法其实和memcpy一样,能移动字符、整型等类型

在这里插入图片描述

(3)memmove函数模拟实现

memmove需要分三种情况讨论

当source在前,destination在后时

在这里插入图片描述

最好的办法就是从destination的4开始往前拷贝,这样就不会导致复制的结果是未定义

在这里插入图片描述

当source在后,destination在前时
在这里插入图片描述
最好的办法就是从destination的9开始往后拷贝
在这里插入图片描述
当source和destination未重叠时
在这里插入图片描述
既可以从前开始拷贝,也能从后开始拷贝


【代码实现】

#include <stdio.h>
#include <string.h>
void* my_memmove(void* dest, void* src, size_t num)
{void* res = dest;if (dest < src){//从前向后拷贝(和memcpy一模一样)while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{//从后向前拷贝while (num--){*((char*)dest + num) = *((char*)src + num);}}
}
int main()
{int a[20] = { 10,9,8,7,6,5,4,3,2,1 };//将a中的8,7,6,5 拷贝到 amy_memmove(a, a+2,16 );for (int i = 0; i < 10; i++){printf("%d ", a[i]);}printf("\n");return 0;
}

在这里插入图片描述

三、memcmp

(1)memcpy函数介绍

在这里插入图片描述

功能 :比较从ptr1和ptr2开始的num个字节

(2)memcpy函数用法

用法其实和strcmp、strncmp差不多 ->点我跳转

在这里插入图片描述

在这里插入图片描述

四、memset函数

功能:内存设置函数(以字节为单位来设置内存中的数据)
memset函数在以往博客有讲解到 -> 传送门

http://www.lryc.cn/news/2205.html

相关文章:

  • python关键字
  • C语言 | 预处理知识详解 #预处理指令有哪些?他们如何使用?宏和函数有哪些区别?...#
  • 如何实现LFU缓存(最近最少频率使用)
  • 【C++之容器篇】精华:vector常见函数的接口的熟悉与使用
  • InstructGPT
  • RTOS之一环境搭建(基于TM4C123GXL)
  • 151、【动态规划】AcWing ——2. 01背包问题:二维数组+一维数组(C++版本)
  • DS期末复习卷(二)
  • 大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute
  • ETL基础概念及要求详解
  • 刷题记录:牛客NC23054华华开始学信息学 线段树+分块
  • 二叉搜索树(查找,插入,删除)
  • C# PictureEdit 加载图片
  • 3种方法设置PDF“打开密码”,总有一种适合你
  • 第三章 数据链路层(点到点的传输服务)-计算机网络(笔记)
  • volatile关键字与CAS机制
  • LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II
  • 【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(二)
  • PCIE 学习笔记(入门简介)
  • 锁的优化机制了解嘛?请进!
  • 5.点赞功能 Redis
  • Java序列化和反序列化(详解)
  • 【刷题篇】链表(上)
  • ConcurrentHashMap设计思路
  • Unity基于GraphView的行为树编辑器
  • 网络流量传输MTU解析
  • 30个HTML+CSS前端开发案例(四)
  • 《TPM原理及应用指南》学习 —— TPM执行环境3
  • 实验名称:经典同步问题:生成者与消费者问题
  • EasyCVR视频云存储的架构解析与Sharelist云存挂载方法介绍