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

字符串和内存函数(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拷贝重叠的内存空间
因此,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的模拟实现:
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个字节
  • 返回值如下:
    memcmp返回值
#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;
}

arr1数组在内存中的存储
arr2数组在内存中的存储

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;
}

memset结果

相关文章:

字符串和内存函数(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打印技术在制造行业的应用日益广泛&#xff0c;为制造业带来了巨大的变革和机遇。这种增材制造技术相较于传统制造工艺具有许多优势&#xff0c;尤其在制造复杂形状零件方面表现出色。 传统制造工艺在制造复杂形状零件时往往面临诸多挑战&#xff0c;如加工难度大、周期…...

【数据中台】开源项目(2)-Moonbox计算服务平台

Moonbox是一个DVtaaS&#xff08;Data Virtualization as a Service&#xff09;平台解决方案。 Moonbox基于数据虚拟化设计思想&#xff0c;致力于提供批量计算服务解决方案。Moonbox负责屏蔽底层数据源的物理和使用细节&#xff0c;为用户带来虚拟数据库般使用体验&#xff0…...

代理模式(常用)

代理模式&#xff08;代理设计模式&#xff09; 在有些情况下&#xff0c;一个客户不能或者不想直接访问另一个对象&#xff0c;这时需要找一个中介帮忙完成某项任务&#xff0c;这个中介就是代理对象。例如&#xff0c;购买火车票不一定要去火车站买&#xff0c;可以通过 123…...

redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构 动态字符串SDS 优点 获取字符串长度的时间复杂度O(1) 支持动态扩容&#xff0c;减少内存分配次数 新字符串小于1M – 新空间为扩展后字符串长度的两倍 1 新字符串大于1M – 新空间为扩展后字符串长度 1M 1. 内存预分配 二进制安全&#xff08;记录了…...

电子学会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.周四&#xff0c;最近几天刷题的节奏太紧张了&#xff0c;放松一点&#xff0c;不能太大压力了&#xff0c;认证看&#xff0c;慢慢看效果会更好一点。 2.发现了一个跑步比较好的地方&#xff0c;沿着凯旋路&#xff0c;然后昭化路&#xff0c;种德桥路。一圈&#xff0c;刚好…...

Qt OpenGL固定管线与可编程管线

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 在Qt框架中,你可以使用Qt的OpenGL模块(包括QOpenGLWidget和QOpenGLFunctions等类)来使用OpenGL进行图形渲染。以下是一个简单的示例,展示了如何在Qt应用程序中使用OpenGL绘…...

冯·诺依曼体系结构和操作系统

目录 一、冯诺依曼体系结构 1、初见结构 2、对体系结构的理解 3、总结 二、操作系统 1、概念 2、作用 一、冯诺依曼体系结构 1、初见结构 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#xff08…...

Nginx(资源压缩)

建立在动静分离的基础之上&#xff0c;如果一个静态资源的Size越小&#xff0c;那么自然传输速度会更快&#xff0c;同时也会更节省带宽&#xff0c;因此我们在部署项目时&#xff0c;也可以通过Nginx对于静态资源实现压缩传输&#xff0c;一方面可以节省带宽资源&#xff0c;第…...

数据结构与算法之二叉树: LeetCode 226. 翻转二叉树 (Typescript版)

翻转二叉树 https://leetcode.cn/problems/invert-binary-tree/ 描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 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&#xff0c; 这个hint是用来忽略唯一键冲突的。类似与mysql的 insert ignore。 语法如下&#xff1a; 在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&#xff1a;HTML5新增 Canvas标签&#xff08;画布&#xff09; 渲染上下文canvas.getContext(contextType[, contextAttributes]) 上下文类型&#xff08;contextType&#xff09; 上下文属性 (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&#xff5e;999之间的所有“水仙花数”并输出11. 猜数字游戏&#x1f648; 1. 计算5的…...

「Verilog学习笔记」非整数倍数据位宽转换24to128

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 要实现24bit数据至128bit数据的位宽转换&#xff0c;必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据&#xff0c;相当于5个输入数据第6个输入数据的拼接成一…...

2023亚太地区数学建模C题思路模型代码论文

C题的参考思路: 1&#xff0c;问题1的思路: 确定研究问题的主要指标体系(新能源电车的售出数量、安全性指标、充电桩数目、电池续 航里程等)&#xff0c;收集指标的对应数据&#xff0c;检验数据是否服从正态性: 若服从正态分布: 0&#xff0c;可考虑优先采用“多元方差分析”模…...

苹果商城App上架指南在中发里查看

苹果商城App上架指引可以在app应用分发平台网站上查看。具体步骤如下&#xff1a; 登录苹果开发者网站。进入“Certificates, Identifiers & Profiles”选项。在页面左侧选择“App Store Connect”。点击“App Store Connect”页面顶部的“Developer Guide”。在左侧菜单中…...

Android 框架层AIDL 添加接口

文章目录 AIDL的原理构建AIDL的流程往冻结的AIDL中加接口 AIDL的原理 可以利用ALDL定义客户端与服务均认可的编程接口&#xff0c;以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中&#xff0c;一个进程通常无法访问另一个进程的内存。因此&#xff0c;为进行通信&a…...

ubuntu命令行下中文乱码怎么解决

大家好,今天来介绍ubuntu命令行中文乱码怎么解决(ubuntu中文文件名乱码)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧! ubuntu命令行下中文乱码怎么解决 我也呀见过这个问题 一. Ubuntu默认的中文字符编码 Ubuntu默认的中文字谈码符编码为zh_CN.UT…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...