字符串和内存函数(2)
文章目录
- 2.13 memcpy
- 2.14 memmove
- 2.15 memcmp
- 2.16 memset
2.13 memcpy
void* memcpy(void* destination, const void* source, size_t num);
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 ‘\0’ 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
- memcpy是内存拷贝,它可以拷贝字符串、整型数组、结构体数组等多种类型,所以要用void*的指针来接收。
#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int arr2[20] = { 0 };//将arr1中的内容,拷贝到arr2中memcpy(arr2, arr1, 40);// int* int*int i = 0;for (i = 0; i < 20; i++){printf("%d ", arr2[i]);//1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0}return 0;
}
#include <stdio.h>
#include <string.h>int main()
{float arr1[] = { 1.0, 2.0, 3.0 };float arr2[5] = { 0 };//将arr1中的内容,拷贝到arr2中memcpy(arr2, arr1, 8);// float* float*int i = 0;for (i = 0; i < 5; i++){printf("%f ", arr2[i]);//1.000000 2.000000 0.000000 0.000000 0.000000}return 0;
}
memcpy的模拟实现:
#include <stdio.h>
#include <assert.h>//函数拷贝结束后,返回目标空间的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;//强制类型转换是临时的,不是永久的}return ret;
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int arr2[20] = { 0 };my_memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 20; i++){printf("%d ", arr2[i]);//1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}return 0;
}
如果目标空间和源头空间有重合,就会出现以下情况:
#include <stdio.h>
#include <assert.h>//函数拷贝结束后,返回目标空间的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;//强制类型转换是临时的,不是永久的}return ret;
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };my_memcpy(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);//1 2 1 2 1 2 1 8 9 10}return 0;
}

因此,memcpy函数是用来处理不重叠的内存拷贝的。
2.14 memmove
void* memmove(void* destination, const void* source, size_t num);
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);//1 2 1 2 3 4 5 8 9 10}return 0;
}
memmove的模拟实现:

#include <stdio.h>
#include <assert.h>void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);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 arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };my_memmove(arr1 + 2, arr1, 20);//1 2 1 2 3 4 5 8 9 10//my_memmove(arr1, arr1 + 2, 20);//3 4 5 6 7 6 7 8 9 10int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
2.15 memcmp
int memcmp(const void* ptr1, const void* ptr2, size_t num);
- 比较从ptr1和ptr2指针开始的num个字节
- 返回值如下:

#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1, 2, 1, 4, 5, 6 };int arr2[] = { 1, 2, 257 };//int ret = memcmp(arr1, arr2, 9);//printf("%d\n", ret);//0int ret = memcmp(arr1, arr2, 10);printf("%d\n", ret);//-1return 0;
}


2.16 memset
void* memset(void* ptr, int value, size_t num);
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "hello bit";memset(arr + 1, 'x', 4);//以字节为单位设置的printf("%s\n", arr);//hxxxx bitreturn 0;
}
#include <string.h>int main()
{int arr[10] = { 0 };memset(arr, 1, 10);return 0;
}

相关文章:
字符串和内存函数(2)
文章目录 2.13 memcpy2.14 memmove2.15 memcmp2.16 memset 2.13 memcpy void* memcpy(void* destination, const void* source, size_t num); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果so…...
毅速:复杂零件制造首选3D打印
确金属3D打印技术在制造行业的应用日益广泛,为制造业带来了巨大的变革和机遇。这种增材制造技术相较于传统制造工艺具有许多优势,尤其在制造复杂形状零件方面表现出色。 传统制造工艺在制造复杂形状零件时往往面临诸多挑战,如加工难度大、周期…...
【数据中台】开源项目(2)-Moonbox计算服务平台
Moonbox是一个DVtaaS(Data Virtualization as a Service)平台解决方案。 Moonbox基于数据虚拟化设计思想,致力于提供批量计算服务解决方案。Moonbox负责屏蔽底层数据源的物理和使用细节,为用户带来虚拟数据库般使用体验࿰…...
代理模式(常用)
代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 123…...
redis(Remote Dictionary Service) 底层数据结构
redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容,减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全(记录了…...
电子学会C/C++编程等级考试2021年06月(三级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:数对 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。 时间限制:1000 内存限制…...
冥想第九百八十五天
1.周四,最近几天刷题的节奏太紧张了,放松一点,不能太大压力了,认证看,慢慢看效果会更好一点。 2.发现了一个跑步比较好的地方,沿着凯旋路,然后昭化路,种德桥路。一圈,刚好…...
Qt OpenGL固定管线与可编程管线
作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 在Qt框架中,你可以使用Qt的OpenGL模块(包括QOpenGLWidget和QOpenGLFunctions等类)来使用OpenGL进行图形渲染。以下是一个简单的示例,展示了如何在Qt应用程序中使用OpenGL绘…...
冯·诺依曼体系结构和操作系统
目录 一、冯诺依曼体系结构 1、初见结构 2、对体系结构的理解 3、总结 二、操作系统 1、概念 2、作用 一、冯诺依曼体系结构 1、初见结构 数学家冯诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(…...
Nginx(资源压缩)
建立在动静分离的基础之上,如果一个静态资源的Size越小,那么自然传输速度会更快,同时也会更节省带宽,因此我们在部署项目时,也可以通过Nginx对于静态资源实现压缩传输,一方面可以节省带宽资源,第…...
数据结构与算法之二叉树: LeetCode 226. 翻转二叉树 (Typescript版)
翻转二叉树 https://leetcode.cn/problems/invert-binary-tree/ 描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1 4 4/ \ / \2 7 >…...
lightdb-ignore_row_on_dupkey_index
LightDB 支持 ignore_row_on_dupkey_index hint LightDB 从23.4 开始支持oracle的 ignore_row_on_dupkey_index hint, 这个hint是用来忽略唯一键冲突的。类似与mysql的 insert ignore。 语法如下: 在LightDB中ignore_row_on_dupkey_index的效果等同于o…...
wangeditor实时预览
<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…...
【前沿技术了解】web图形Canvas、svg、WebGL、数据可视化引擎的技术选型
目录 Canvas:HTML5新增 Canvas标签(画布) 渲染上下文canvas.getContext(contextType[, contextAttributes]) 上下文类型(contextType) 上下文属性 (contextAttributes) 示例 动画 setInterval(function, delay)…...
【Java】循环语句练习
文章目录 1. 计算5的阶乘2. 计算 1! 2! 3! 4! 5!3. 数字9 出现的次数4. 判定素数5. 求1-100之间的素数6. 求2个整数的最大公约数7. 计算分数的值8. 模拟登陆9. 输出乘法口诀表10. 求出0~999之间的所有“水仙花数”并输出11. 猜数字游戏🙈 1. 计算5的…...
「Verilog学习笔记」非整数倍数据位宽转换24to128
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 要实现24bit数据至128bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据,相当于5个输入数据第6个输入数据的拼接成一…...
2023亚太地区数学建模C题思路模型代码论文
C题的参考思路: 1,问题1的思路: 确定研究问题的主要指标体系(新能源电车的售出数量、安全性指标、充电桩数目、电池续 航里程等),收集指标的对应数据,检验数据是否服从正态性: 若服从正态分布: 0,可考虑优先采用“多元方差分析”模…...
苹果商城App上架指南在中发里查看
苹果商城App上架指引可以在app应用分发平台网站上查看。具体步骤如下: 登录苹果开发者网站。进入“Certificates, Identifiers & Profiles”选项。在页面左侧选择“App Store Connect”。点击“App Store Connect”页面顶部的“Developer Guide”。在左侧菜单中…...
Android 框架层AIDL 添加接口
文章目录 AIDL的原理构建AIDL的流程往冻结的AIDL中加接口 AIDL的原理 可以利用ALDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信&a…...
ubuntu命令行下中文乱码怎么解决
大家好,今天来介绍ubuntu命令行中文乱码怎么解决(ubuntu中文文件名乱码)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧! ubuntu命令行下中文乱码怎么解决 我也呀见过这个问题 一. Ubuntu默认的中文字符编码 Ubuntu默认的中文字谈码符编码为zh_CN.UT…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
