字符串和内存函数(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…...
游戏模组框架:SMAPI构建个性化星露谷体验的全栈解决方案
游戏模组框架:SMAPI构建个性化星露谷体验的全栈解决方案 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 1 技术架构解析:SMAPI如何重塑游戏扩展能力 在独立游戏模组生态中&a…...
2026高性价比降AI工具盘点 高效过审适配全场景
一、摘要 据2026年学术服务行业调研数据显示,随着AIGC工具在写作场景的普及,国内各类文档的AI生成占比较上年提升35%,高校、科研机构及企业对AI生成内容的管控标准持续收紧。超过70%的用户曾遇到过降AI效果不稳定、收费偏高、检测不通过售后无…...
【MATLAB实例教程:五分钟快速上手教程】
前言MATLAB(Matrix Laboratory)是MathWorks公司开发的高性能数值计算和可视化软件,广泛应用于工程、科学、金融和数据分析领域。本文将通过一个完整的实例,演示MATLAB在数据分析和可视化方面的强大功能。这是一个面向绝对初学者的…...
什么是大模型技术栈?
什么是技术栈? 咱们可以把大模型想象成一个“超级大脑”,技术栈就是为了打造和运转这个大脑所需要的一整套工具、方法和技术的集合。 用建房子来打个比方,大模型技术栈主要分为四层: 地基(硬件层)&#…...
给电机控制新手的PMSM建模避坑指南:从ABC到dq坐标变换,手把手推导电压方程
永磁同步电机建模实战:从ABC到dq坐标变换的避坑手册 刚接触永磁同步电机(PMSM)控制的工程师,往往会在坐标变换和电压方程推导的数学迷宫中迷失方向。那些看似简单的矩阵运算背后,藏着无数新手容易踩中的陷阱——等幅值与等功率变换的混淆、电…...
避坑指南:ABB机器人PC SDK开发中,网络扫描(NetworkScanner)为何总为空?
ABB机器人PC SDK网络扫描故障深度排查指南 当你在C#项目中调用NetworkScanner.Scan()方法时,那个本该充满控制器信息的ControllerInfoCollection却固执地保持空白——这种挫败感每个ABB机器人开发者都深有体会。本文将从协议栈底层到网络拓扑,系统性地拆…...
MIKEURBAN几种错误解决方法
今天小编给大家总结关于MIKEURBAN计算中常见的几种错误吧!错误一MIKE URBAN出现以上的错误时候,我们按照错误提示找出错误点的编号,此时的错误点是由于没有和汇水区做链接导致,重新手动做链接即可解决。错误二MIKE URBAN出现以上的…...
STM32CubeMX 6.4+ 配置FreeRTOS+LWIP避坑实录(正点原子探索者V2 + LAN8720A)
STM32CubeMX 6.4高版本FreeRTOS与LWIP配置全攻略:从PHY复位到网络调试 最近在给正点原子探索者V2开发板移植FreeRTOSLWIP时,发现网上大部分教程都停留在CubeMX 5.x时代。当我用6.4版本按照老教程操作时,从时钟配置到PHY复位处处碰壁。经过三天…...
飞机遥感影像的数据集记录
飞机遥感影像的数据集记录: - 飞机检测数据集: DIOR、NWPU VHR-10、DOTA、LEVIR和RSOD等,但是上述数据集没有提供飞机目标具体型号信息,仅适用于飞机目标检测,不适用于飞机目标细粒度识别算法研究。 - 1. 飞机切片目标分类任务: M…...
比迪丽LoRA部署教程:WSL2+Windows本地GPU环境全适配方案
比迪丽LoRA部署教程:WSL2Windows本地GPU环境全适配方案 你是不是也想在本地电脑上运行AI绘画,生成自己喜欢的动漫角色?特别是像《龙珠》里的比迪丽这样的经典角色,如果能用自己的电脑随时生成,那该多方便。 今天我就…...
