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

【C语言(十一)】

C语言内存函数

一、memcpy使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

对于重叠的内存,交给memmove来处理。

memcpy函数的模拟实现:

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;//((char*)dest)++ - 有些编译器会报错src = (char*)src + 1;}return ret;
}int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9 };int arr2[10] = { 0 };my_memcpy(arr2, arr1 + 3, 5 * sizeof(int));int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

二、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 ", arr2[i]);}return 0;
}
输出的结果:

memmove的模拟实现: 

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{//后 -> 前*((char*)dest+num) = *((char*)src+num);}return ret;
}int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9 };my_memmove(arr1, arr1 + 3, 5 * sizeof(int));int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

 C语言中规定:

memcpy 拷贝的就是不重叠的内存

memmove 拷贝的是重叠的内存

但在VS2022中 memcpy也可以实现重叠拷贝

三、memset函数的使用

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);printf(str);return 0;
}
输出的结果:

四、memcmp函数的使用 

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
返回值如下:

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

相关文章:

【C语言(十一)】

C语言内存函数 一、memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果sourc…...

系统运行占用过高

1、CPU过高的问题排查 示例代码&#xff1a; public class Test { static class MyThread extends Thread { public void run() { // 死循环&#xff0c;消耗CPU int i 0; while (true) { i; } } } public static void main(String args[]) throws InterruptedException { ne…...

HTML---初识CSS

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS&#xff0c;开发者可以在不改变HTML标记结构的情况…...

监控pod 容器外网请求网络带宽,过滤掉内网、基于k8spacket开发、prometheus开发export

首先安装k8spacket 安装k8spacket遇到问题&#xff0c;下载插件一直能不能下载成功&#xff0c;pod不能启动。所有手动下载处理。 helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart helm pull k8spacket/k8spacket打开values.yaml 文件 手动下载插…...

windows下docker环境安装

开启硬件虚拟化技术 win10中开启 Hyper-V Win10 下是否开启硬件虚拟化技术&#xff0c;在控制面板&#xff0c;启用 window 功能&#xff0c;找到 Hyper-V 选项&#xff0c;点勾选确认。如图&#xff1a; Windows 11 家庭中文版新增 Hyper-V选项 注意以下的解决方案来自win1…...

Python小程序 - 表格数值统计

题设&#xff1a;Excel表格中&#xff0c;计算如下图所示不同颜色&#xff08;蓝、黄、桔&#xff09;单元格值&#xff1a;各颜色填涂的单元格值的总和条件&#xff1a; - Excle表格中 - 分色标记&#xff0c;单元格有值 - 开始列&#xff08;当前为D&#xff09;&#xff0c;…...

Unity | Shader基础知识(第一集:unity中最简单的shader)

目录 一、unity的shader 二、创建一个shader&#xff08;在创建时&#xff0c;选前三种都可以&#xff09; 三、内容解读 1.shader一直都在 2.我们写shader在写什么 四、没有被干预的shader&#xff08;最简单的shader&#xff09; 相关阅读 编写着色器概述 - Unity 手册…...

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒&#xff0c;沙盒技术顾名思义就是像一个集装箱一样&#xff0c;把应用(服务&#xff0c;进程之类的)装起来的技术&#xff0c;这样每个进程在自己的沙盒中和其他的沙盒隔离开来&#xff0c;每个沙盒之间存在一个边界使得他们互不干扰&#xff0…...

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 &#xff1a; tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…...

【Docker】WSL 2 上的 Docker 搭建和入门

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 安装安装Docker Desktop for Windows 2️⃣ 环境配置3️⃣ hello world第一次运行再次运行分析总结 &#x1f4d6; 参考资料 &#x1f6eb; 导读 开发环境 版本号描述文章日期2023-12-14操作系统Win11 - 22H222621.2715WSL2 C:…...

pytorch环境配置

1.创建环境 conda create --name pytorch python3.11.5 2.激活环境 source activate pytorch 3.添加国内镜像源&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsin…...

电子眼+无人机构建平安城市视频防控监控方案

电子眼&#xff08;也称为监控摄像机&#xff09;可以通过安装在城市的不同角落&#xff0c;实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用&#xff0c;可以帮助警方及时发现并响应各类安全事件…...

mysql binlog_ignore_db参数的效果详解

​ 我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等)。 我们可以在mysql配置文件中关闭binlog [mysqld] skip-log-bin注意默认情况下会记录所有库的操作,那么如果我们有另类需求,比如说只让某个库记录 binglog 或排除某个库记录…...

HI3559AV100和FPGA 7K690T的PCIE接口调试记录-续

上文https://blog.csdn.net/fzktongyong/article/details/134963814?spm1001.2014.3001.5501 上一篇文中PCIE实测速度和理论计算有较大偏差&#xff0c;经过尝试后有所提升。 1、提升效果 1&#xff09;、RC写操作&#xff0c;实测速度817MB/s&#xff08;410407&…...

vivado约束方法4

时序约束向导 定时约束向导确定合成或上缺少的定时约束实现的设计。它分析了网表、时钟网络连接和现有的定时限制&#xff0c;以便根据《超快设计方法指南》提供建议用于FPGA和SoC&#xff08;UG949&#xff09;。以下11涵盖了三类约束页面&#xff0c;然后是摘要。包括以下步…...

LeetBook学习-C语言-数组

1.数组的操作 1.1 读取元素 知道内存地址可以快速访问&#xff0c;时间复杂度为O(1) 1.2 查找元素 从首地址开始&#xff0c;逐个查找&#xff0c;最坏时间复杂度为O(N) 1.3 插入元素 插入元素&#xff0c;首先位置要腾空&#xff0c;而后执行插入操作。 1.4 删除元素 删除掉某…...

23种策略模式之策略模式

23种策略模式之策略模式 文章目录 23种策略模式之策略模式前言优缺点使用场景角色定义UML模拟示例小结 前言 在软件开发中&#xff0c;设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式&#xff08;Strategy Pattern&#xff09;是其中一种常见的设计模式&a…...

【笔试强化】Day 2

文章目录 一、选择1.2.&#xff08;写错&#xff09;3.4.5.6.&#xff08;不会&#xff09;7.&#xff08;不清晰&#xff09;8. &#xff08;不会&#xff09;9.10.&#xff08;写错&#xff09; 二、编程1. 排序子序列解法&#xff1a;代码&#xff1a; 2. 倒置字符串解法&am…...

windows禁用系统更新

1.在winr运行框中输入services.msc&#xff0c;打开windows服务窗口。 services.msc 2.在服务窗口中&#xff0c;我们找到Windows update选项&#xff0c;如下图所示&#xff1a; 3.双击windows update服务&#xff0c;我们把启动类型改为禁用&#xff0c;如下图所示&#xff…...

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…...

Kubernetes 环境下 SkyWalking 的高效部署与性能调优

1. Kubernetes 环境下的 SkyWalking 部署实战 第一次在 Kubernetes 上部署 SkyWalking 时&#xff0c;我踩了不少坑。记得当时为了调试一个存储配置问题&#xff0c;整整熬了两个通宵。现在回想起来&#xff0c;如果当时有人能给我一份详细的实战指南&#xff0c;至少能节省 80…...

WarcraftHelper:魔兽争霸III游戏性能优化与兼容性解决方案完整指南

WarcraftHelper&#xff1a;魔兽争霸III游戏性能优化与兼容性解决方案完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争…...

DCT-Net人像卡通化效果展示:高清人脸转二次元虚拟形象作品集

DCT-Net人像卡通化效果展示&#xff1a;高清人脸转二次元虚拟形象作品集 一键将真人照片变成二次元虚拟形象&#xff0c;体验AI绘画的神奇魅力 1. 效果惊艳&#xff1a;从真人到二次元的华丽变身 DCT-Net人像卡通化技术能够将普通的人物照片转换成精美的二次元虚拟形象&#x…...

忍者像素绘卷镜像免配置:一键切换‘天界画坊’/‘木叶村’双主题UI

忍者像素绘卷镜像免配置&#xff1a;一键切换天界画坊/木叶村双主题UI 1. 产品概述 忍者像素绘卷是一款专为像素艺术创作者设计的图像生成工作站&#xff0c;基于Z-Image-Turbo深度优化引擎开发。这款工具将传统忍者文化与现代AI技术完美结合&#xff0c;创造出独特的16-Bit复…...

DRM驱动(三)之核心模块回调函数解析

1. DRM驱动回调函数的核心作用 如果你曾经在Linux系统下开发过显示驱动&#xff0c;一定会对DRM&#xff08;Direct Rendering Manager&#xff09;框架不陌生。作为现代Linux显示系统的核心&#xff0c;DRM框架通过一系列精心设计的回调函数&#xff0c;让硬件厂商能够灵活地适…...

ExpressionUtil实战指南:从基础解析到高级应用

1. ExpressionUtil工具类入门指南 第一次接触ExpressionUtil时&#xff0c;我正被项目中复杂的表达式计算需求困扰。这个工具类就像瑞士军刀一样&#xff0c;帮我解决了各种字符串表达式处理的难题。简单来说&#xff0c;ExpressionUtil是Java开发中处理数学表达式、逻辑判断的…...

封神级C++设计:用3个成员实现可清空、可恢复、零开销的容器(颠覆传统思维)

封神级C设计&#xff1a;用3个成员实现可清空、可恢复、零开销的容器&#xff08;颠覆传统思维&#xff09; 文章目录封神级C\\设计&#xff1a;用3个成员实现可清空、可恢复、零开销的容器&#xff08;颠覆传统思维&#xff09;一、传统方案的“坑”&#xff1a;要么笨重&…...

**实时内核中的任务调度机制:从理论到C++实现的深度探索**在嵌入式系统和高实时性应用中,**实时内核(Real-

实时内核中的任务调度机制&#xff1a;从理论到C实现的深度探索 在嵌入式系统和高实时性应用中&#xff0c;实时内核&#xff08;Real-Time Kernel&#xff09; 是整个系统稳定运行的核心。它不仅负责资源分配&#xff0c;还承担着任务调度、中断响应、同步机制等关键职责。本文…...

第三章、CLion+GCC+OpenOCD构建STM32标准库开发环境:从零到调试的完整实践

1. 环境准备与工具链安装 搭建STM32标准库开发环境的第一步&#xff0c;就是准备好所有必要的工具。这里我们需要三个核心组件&#xff1a;CLion作为集成开发环境、arm-none-eabi-gcc作为编译器、OpenOCD作为调试器。这三个工具的组合&#xff0c;可以让我们在Windows平台上获得…...

单片机IO口驱动能力解析与LED驱动设计

1. 单片机IO口驱动能力基础概念刚接触单片机开发时&#xff0c;很多同学对IO口的驱动能力概念感到困惑。实际上&#xff0c;驱动能力直接决定了单片机引脚能带动多大的负载。以常见的51单片机为例&#xff0c;其IO口在输出低电平时的灌电流能力通常为10-20mA&#xff0c;而输出…...