常见的内存操作函数

news2024/12/23 23:45:26

在这里插入图片描述

👦个人主页:@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 拷贝到 a
	my_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.coloradmin.cn/o/337367.html

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

相关文章

Java的异常处理

异常 异常就是程序非正常运行时的报错&#xff0c;不正常就是异常。 异常分类 通常分为两类&#xff1a; Error&#xff1a;错误。通常是Java虚拟机无法解决的严重问题。如&#xff1a;JVM系统内部错误、资源耗尽等严重情况。比如&#xff1a;StackOverflowError和OOM-->…

canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状

首先在选中图形的时候需要用鼠标右击来弹出选择框&#xff0c;实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件&#xff1a; <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…

PCB设计中的数据单位,层作用,工艺要求,制作过程等简介

PCB中常识 物理结构常识 几乎每层板子都是由两个金属层夹着一个绝缘层&#xff0c;像一个三明治结构。多层板是这种双层板叠加压合的。 常见的层的作用 参考&#xff1a;https://www.21ic.com/article/854059.html PCB电路板一般而言会分成六层&#xff0c;具体为&#x…

第二十四章 java并发常见知识内容(AQS)

JAVA重要知识点AQS介绍AQS的核心思想AQS资源共享方式自定义同步器常见同步工具类Semaphore(信号量)CountDownLatch(倒计时器)CyclicBarrier(循环栅栏)AQS 介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.c…

图解 git 常用命令

本文图解 Git 中的最常用命令&#xff0c;如果你稍微理解 Git 的工作原理&#xff0c;这篇文章能够让你理解的更透彻。 基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git add files 把当前文件放入暂存区域。 git commit 给暂存区域生成快照…

java集合:Collection:Set+List+Dueue

目录 Collection集合 1.常用方法 2.使用Iterator接口遍历集合元素 3.使用foreach循环遍历集合元素 4.Set集合 4.1 HashSet类 4.2 LinkedHashSet类 4.3 TreeSet类 4.4 EnumSet类 5. List接口 5.1 ListIteractor接口 5.2 Stack类 5.3 Arrays.ArrayList 5.4 Linke…

ChatGPT体验失败的经历

ChatGPT的介绍 最近有一个很热门的话题&#xff0c;而且这个话题内容已经覆盖了多个领域。ChatGPT这个词&#xff0c;最近不断的出现在微博的热搜或者公众号的文章里。那我们先大概了解一下ChatGPT。 ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序&#xff0c;于2022年11…

在Allegro设计界面中如何修改封装焊盘

在Allegro PCB设计界面中修改封装焊盘的方法1、选择菜单Tools→Padstack→Modify Design Padstack...2、然后点击封装上要修改的焊盘&#xff0c;右击选择Edit或者点击Options选项卡下要修改的焊盘&#xff0c;然后点击Edit修改3、修改完焊盘后&#xff0c;选择File→Update to…

PyTorch学习笔记:nn.PReLU——PReLU激活函数

PyTorch学习笔记&#xff1a;nn.PReLU——PReLU激活函数 torch.nn.PReLU(num_parameters1, init0.25, deviceNone, dtypeNone)功能&#xff1a;逐元素对数据应用如下函数公式进行激活 PReLU(x)max⁡(0,x)a∗min⁡(0,x)\text{PReLU}(x)\max(0,x)a*\min(0,x) PReLU(x)max(0,x)a∗…

JS document.write()换行

换行效果&#xff1a; 通过传递多个参数&#xff0c;即可实现换行效果&#xff1a; document.write("<br>",ar) 效果&#xff1a; 示例源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

Vue3 中 导航守卫 的使用

目录前言&#xff1a;一、什么是导航守卫&#xff1f;二、导航守卫有哪几种&#xff1f;1、全局守卫&#xff08;3个&#xff09;全局前置守卫全局解析守卫全局后置钩子2、路由独享守卫&#xff08;1个&#xff09;3、组件内守卫&#xff08;3个&#xff09;beforeRouteEnter(t…

大数据Kylin(二):Kylin安装使用

文章目录 Kylin安装使用 一、Kylin安装要求 二、Kylin安装 1、Kylin安装前环境准备

SpringCloud-Netflix学习笔记12——Hystrix-Dashboard实现服务监控

一、服务监控 hystrixDashboard 除了隔离依赖服务的调用以外&#xff0c;Hystrix还提供了准实时的调用监控&#xff08;Hystrix Dashboard&#xff09;&#xff0c;Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息&#xff0c;并以统计报表和图形的形式展示给用户&…

MikTex+Texmaker环境LaTeX使用bib文件引用参考文献步骤

一、MikTexTexmaker环境 MikTexTexmaker环境是一个LaTeX编辑与编译&#xff0c;以及PDF预览环境。如果还没装好的话&#xff0c;推荐浏览【MiKTeXTexmaker安装】这篇博客去安装此环境。 二、准备bib文件 文件名命名为ref.bib&#xff0c;添加如下内容(作为demo) article{kaelb…

微信小程序nodejs+java+python美食制作教程系统

食谱大全所要实现的功能分析,对于现在网络方便,食谱大全要实现管理员、用户可以直接在平台上进行查看自己所需数据信息,这样既能节省管理的时间,不用再像传统的方式,如果用户想要进行交流信息,必须双方见面进行沟通交流所需的信息,由于很多用户时间的原因,没有办法进行见面沟通…

MySQL_InnoDB引擎

InnoDB引擎 逻辑存储结构 表空间&#xff08;ibd文件&#xff09;&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段&#xff0c;分为数据段&#xff08;Leaf node segment&#xff09;、索引段(Non-leaf node segment)、回滚段(Rollba…

【LeetCode】每日一题(1)

目录 题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 写在最后&#xff1a; 题目&#xff1a; 这是他给出的接口&#xff1a; class Solution { public:int fillCups(vector<int>& amount) {} }; 作为一个数学学渣&#xff0c;我想不出厉害的数学算法…

151、【动态规划】AcWing ——2. 01背包问题:二维数组+一维数组(C++版本)

题目描述 原题链接&#xff1a;2. 01背包问题 解题思路 &#xff08;1&#xff09;二维dp数组 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]的含义&#xff1a; 容量为j时&#xff0c;从物品1-物品i中取物品&#xff0c;可达到的最大价值 &#xff08;2…

ChatGPT入门系列(一)——注册

ChatGPT入门教程最近一段时间&#xff0c;OpenAI发布的ChatGPT聊天机器人太火了&#xff0c;连着上了各个平台的热搜榜。这个聊天机器人最大的特点是模仿人类说话风格&#xff0c;同时回答各种问题。有人说ChatGPT是真正的人工智能&#xff0c;它不仅能和你聊天&#xff0c;还是…

我的企业需要一个网站吗?答案是肯定的 10 个理由

如果您的企业在没有网站的情况下走到了这一步&#xff0c;您可能会想&#xff1a;我的企业需要一个网站吗&#xff1f;如果我的企业没有一个就已经成功了&#xff0c;那又有什么意义呢&#xff1f;简短的回答是&#xff0c;现在是为您的企业投资网站的最佳或更重要的时机。网站…