59.【C语言】内存函数(memmove函数)

目录

2.memove函数

*简单使用

部分翻译

*模拟实现

方案1

方案2

1.有重叠

dest在src左侧

dest在src右侧

2.无重叠

代码


2.memove函数

*简单使用

memove:memory move

cplusplus的介绍 点我跳转

对比第59篇的memcpy函数

对比memmcpy函数的介绍如下区别:

部分翻译

memmove多了:Copying takes place as if an intermediate buffer were used(复制就像中间的缓存区使用一样), allowing the destination and source to overlap.

memcpy多了:, and should not overlap (for overlapping memory blocks, memmove is a safer approach).

说明memmove允许source指针和destination指针有重叠

将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1+2, arr1, 5* sizeof(int));return 0;
}

*模拟实现

设计一个函数sim_memmove,参数及类型与memmove相同

方案1

线索:上方cplusplus的翻译

可以在函数中设计一个缓存区数组buffer来转移数据

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{char buffer[1000] = { 0 };//最多移动1000个字符//s_src是save_source的缩写const char* s_src = (const char*)src;//s_dest是save_destination的缩写char* s_dest = (char*)dest;//保存返回值for (size_t i = 0; i < num; i++){buffer[i] = s_src[i];//s_src已经被强制类型转换过了,不用在循环的时候进行}src = s_src;for (size_t i = 0; i < num; i++){s_dest[i] = buffer[i];}return dest;}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };sim_memmove(arr+2, arr, 5* sizeof(int));return 0;
}

如果想让程序更安全

可以在开头加上:

// 如果 dest 和 src 重叠
if (dest == NULL || src == NULL || num == 0) 
{return dest;
}// 确保不超过 1000 字节
if (num > 1000) 
{return NULL; // 或者可以返回一个错误码
}

方案2

方案1可以优化,设计一个buffer数组会占用空间,只是需要考虑复制的方向

分为dest和src的部分是否有重叠进行讨论

1.有重叠
dest在src左侧

从src前向后复制,防止重叠

dest在src右侧

从src后向前复制,防止重叠

2.无重叠

从src前向后复制或从src后向前复制均可

比较dest和src的大小关系即可

代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{void* s_dest = 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 s_dest;}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };sim_memmove(arr + 2, arr, 5 * sizeof(int));return 0;
}

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

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

相关文章

金刚石切削工具学习笔记分享

CVD钻石-合成单晶钻石之一 金刚石具有极高的硬度和耐磨性、较低的摩擦系数、较高的弹性模量、较高的热导率、较低的热膨胀系数、与有色金属的亲和力较小等优点&#xff0c;是目前最硬的工具材料&#xff0c;主要分为单晶金刚石和聚晶金刚石两大类。单晶金刚石又分为天然单晶金…

常用卫星学习

文章目录 Landsat-8 Landsat-8 由一台操作陆地成像仪 &#xff08;OLI&#xff09; 和一台热红外传感器 &#xff08;TIRS&#xff09;的卫星&#xff0c;OLI 提供 9 个波段&#xff0c;覆盖 0.43–2.29 μm 的波长&#xff0c;其中全色波段&#xff08;一般指0.5μm到0.75μm左…

CentOS Stream 9部署MariaDB

1、更新系统软件包 sudo dnf update 2、安装MariaDB软件包&#xff08;替代mysql&#xff09; sudo dnf install mariadb-server 3、安装MariaDB服务 sudo systemctl enable --now mariadb 4、检查MariaDB服务状态 sudo systemctl status mariadb 5、配置MariaDB安全性 sudo my…

锐捷 睿易路由器存在RCE漏洞

漏洞描述 锐捷Ruijie路由器命令执行漏 漏洞复现 FOFA: icon_hash"-399311436" 点击左下角的“网络诊断”&#xff0c;在“Tracert检测”的“地址”框中&#xff0c;输入127.0.0.1;ls&#xff0c;接着点击“开始检测”&#xff0c;会在检测框中回显命令执行结果。…

代码编辑器 —— SourceInsight实用技巧

目 录 Source insight 重要性一、创建项目二、代码浏览三、代码同步 Source insight 重要性 Source Insight 是一款功能强大的代码编辑器&#xff0c;在软件开发中占据着重要地位。 Source Insight 能够帮助开发者更高效地解读和修改代码&#xff0c;提高开发效率和代码质量。…

LeetCode_sql_day31(1384.按年度列出销售总额)

目录 描述 1384.按年度列出销售总额 数据准备 分析 法一 法二 代码 总结 描述 1384.按年度列出销售总额 Product 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | product_id | int | | product_name | var…

CentOS Stream 9部署docker,并开启API

1、安装docker &#xff08;1&#xff09;安装Docker的依赖项和存储库 sudo dnf install -y dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &#xff08;2&#xff09;安装Docker sudo dnf install -y docke…

网站建设中,网站设计的未来发展趋势是什么

网站建设中&#xff0c;网站设计的未来发展趋势是多方面的&#xff0c;涵盖了技术革新、用户体验优化以及市场需求变化等多个维度。以下是对网站设计未来发展趋势的详细预测&#xff1a; 移动优先与响应式设计&#xff1a;随着移动设备的普及&#xff0c;未来的网站设计将更加注…

从零开始:在VSCode中打造完美的C++开发环境

在现代软件开发中&#xff0c;选择一个合适的集成开发环境 (IDE) 至关重要&#xff0c;它不仅能够提高工作效率&#xff0c;还能让编程变得更加轻松愉快。VSCode 凭借其轻量化、高度扩展性以及强大的插件生态&#xff0c;已成为众多开发者的首选。然而&#xff0c;要在 VSCode …

[Redis][Set]详细讲解

目录 0.前言1.常用命令1.SADD2.SMEMBERS3.SISMEMBER4.SCARD5.SPOP6.SMOVE7.SREM 2.集合间操作0.是什么&#xff1f;1.SINTER2.SINTERSTORE3.SUNION4.SUNIONSTORE5.SDIFF6.SDIFFSTORE 3.内部编码1.intset(整数集合)2.hashtable(哈希表) 4.使用场景 0.前言 集合类型也是保存多个字…

ReKep——李飞飞团队提出的让机器人具备空间智能:基于视觉语言模型GPT-4o和关系关键点约束

前言 由于工厂、车厂的任务需求场景非常明确&#xff0c;加之自今年年初以来&#xff0c;我司在机器人这个方向的持续大力度投入(包括南京、长沙两地机器人开发团队的先后组建)&#xff0c;使得近期我司七月接到了不少来自车厂/工厂的订单&#xff0c;比如其中的三个例子&…

数据结构与算法-18算法专向(hash)

话题引入&#xff1a; 给你N&#xff08;1<N<10&#xff09;个自然数,每个数的范围为&#xff08;1~10000000000&#xff09;。现在让你以最快的速度判断某一个数是否在这N个数内&#xff0c;不得使用已经封装好的类&#xff0c;该如何实现。 A[] new int[N1]&#xff…

芝士AI一次过!开题报告通用模板,可直接套用!

在正式写开题报告之前&#xff0c;需要搞清楚以下几个问题。 ①你选择这个论文选题的理由是什么&#xff1f;&#xff08;选题背景&#xff09; ②你打算去研究什么&#xff1f;解决什么问题&#xff1f;&#xff08;研究内容&#xff09; ③该选题目前有哪些研究&#xff0…

新峰商城之订单(二):订单生成

在订单确认页面处理完毕后&#xff0c;此时用户单击“提交订单”按钮&#xff0c;商城系统就对应生成一笔订单数据并保存在数据库中&#xff0c;此即订单生成功能。 在单击“提交订单”按钮后&#xff0c;后端会进行一系列操作&#xff0c;包括数据查询、数据判断、数据整合等&…

构建与优化自定义进程池

1. 什么是进程池&#xff1f; 简单来说&#xff0c;进程池就是预先创建固定数量的工作进程&#xff0c;通过设计任务队列或调度算法来分配任务给空闲的进程 —— 实现“负载均衡”。 2. 进程池框架设计 枚举错误返回值&#xff1a; enum {UsageError 1,ArgError,PipeError };…

人工智能时代的学与教

疫情逐渐散去之后&#xff0c;最最吸引全球目光的应该就是ChatGPT-3了。美国政治家亨利基辛格领衔出版的新书《AI世代与我们人类的未来》(The Age of AI and Our Human Future)中举了一个例子来说明ChatGPT-3的能力。首先让ChatGPT-3阅读关于它自身能力的哲学评论之后&#xff…

【吊打面试官系列-MySQL面试题】MyISAM 表格将在哪里存储,并且还提供其存储格式?

大家好&#xff0c;我是锋哥。今天分享关于【MyISAM 表格将在哪里存储&#xff0c;并且还提供其存储格式&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyISAM 表格将在哪里存储&#xff0c;并且还提供其存储格式&#xff1f; 每个 MyISAM 表格以三种格式存储…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama&#xff08;前提&#xff09; sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

读取t x t文件生成exce

读取t x t文件生成excel package com.moka.api.custom.core.controller; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermode…

LangChain基础知识大全

LangChain基础知识大全 一、部署ChatGLM-6B1.拉取源码2.安装环境3.下载模型4.修改api.py配置5.运行api.py 二、Models组件1.LLM&#xff08;大语言模型&#xff09;2.Chat Model&#xff08;聊天模型&#xff09;3.Embedding Model&#xff08;嵌入模型&#xff09;3.1 下载中文…