字符串拷贝时的内存重叠问题
字符串拷贝时的内存重叠问题
1.什么是内存重叠
拷贝的目的地址在源地址的范围内,有重叠。
如在写程序的过程中,我们用到的strcpy这个拷贝函数,在这个函数中我们定义一个目的地址,一个源地址,在拷贝的过程中如果内存重叠了,使用这个函数程序会出现问题,源地址与目的地址重叠,目的地址在源地址的范围内,发生了内存重叠。
2.如何判断内存重叠
可以将它们的地址求出来。
(1)若目的地址小于源地址,即目的地址的数据覆盖了源地址。则发生了内存重叠。(左边为低地址)
如:目的地址 地址:100 源地址 地址:104
( 2 )目的地址所指的区域是源地址的一部分。
如:目的地址 地址:100 源地址:096
3.如何解决内存重叠。
在遇到内存重叠这一问题时,要考虑拷贝的方向。当源地址和目的地址不重叠时,由低字节向高字节拷贝。当这两者重叠时,高字节向低字节拷贝。在使用strcpy和memcpy这两个函数来复制字符串时,会遇到内存重叠问题,因为这两个函数不对内存重叠进行判断。而我们可以用memmove函数来判断,这个函数对内存重叠进行了判断,我们可以看一下这三个函数的原型:
1.strcpy()原型写法: 字符串拷贝.
char *strcpy(char *strDest, const char *strSrc)
{assert((strDest!=NULL) && (strSrc !=NULL));char *address = strDest;while( (*strDest++ = * strSrc++)·1 != '/0')NULL ;return address ;
}
2.memcpy函数的原型写法:内存拷贝
void *memcpy(void *dest, const void *source, size_t count)
{assert((NULL != dest) && (NULL != source));char *tmp_dest = (char *)dest;char *tmp_source = (char *)source;while(count --)//不对是否存在重叠区域进行判断*tmp_dest ++ = *tmp_source ++;return dest;
}
3.memmove函数的原型写法:
void *memmove(void *dest, const void *source, size_t count)
{assert((NULL != dest) && (NULL != source));char *tmp_source, *tmp_dest;tmp_source = (char *)source;tmp_dest = (char *)dest;if((dest + count{while(count--)*tmp_dest++ = *tmp_source++;}else//如果有重叠(反向拷贝){tmp_source += count - 1;tmp_dest += count - 1;while(count--)*--tmp_dest = *--tmp;}return dest;
}
在进行内存重叠的考虑时,strcpy,memcpy都要做一个内存重叠的判断:
对于strcpy需要加上一个断言:
int count = strlen(src) + 1;
Assert (dest(src+count))
对于memcpy需要加上一个断言:Assert(dst<=src || src+count
在strcpy函数中需要注意导入的形参dst,src不能有内存重叠。(尤其注意dst不能处在src字符串的内存中间,否则拷贝的时候会替换到src原有的结束字符,最终导致src字符串无结束字符,一直拷贝下去导致程序崩溃)
char *my_strcpy(char *dst,char *src)
{char *_src = NULL;char *_dst = NULL;int len = strlen(src);if(dst>src && dst < src + len) //dst内存处于src字符串内存中间,不能正向拷贝(原因见上述说明)。结果会影响到src源字符串{_src = src + len;//到最后的\0字符_dst = dst + len;while(len >= 0) //=0 走到下标0的字符{*_dst-- = *_src--;len--;}}else{_src = src;_dst = dst;while(len >= 0) //len:1-len,现在放宽一位0-len,表示从下标0-下标len,包括了\0字符{*_dst++ = *_src++; // \0len--;}}return dst;
}int main()
{char a[20] = "123456789";char b[20] = {0};char *src,*dst;src = a;dst = a+5;my_strcpy(dst,src);//dst,src内存重叠my_strcpy(b,src); //b,src内存无重叠printf("%s\n",src);printf("%s\n",b);return 0;
}
该文章会更新,欢迎大家批评指正。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器
相关文章:
字符串拷贝时的内存重叠问题
字符串拷贝时的内存重叠问题 1.什么是内存重叠 拷贝的目的地址在源地址的范围内,有重叠。 如在写程序的过程中,我们用到的strcpy这个拷贝函数,在这个函数中我们定义一个目的地址,一个源地址,在拷贝的过程中如果内存重…...
告别PPT手残党!这6款AI神器,让你秒变PPT王者!
如果你是一个PPT手残党,每每制作PPT总是让你焦头烂额,那么你一定需要这篇幽默拉风的推广文案! 我向你保证,这篇文案将帮助你发现6款AI自动生成PPT的神器,让你告别PPT手残党的身份,成为一名PPT王者。 无论…...
JVM配置与优化
参考: JVM内存分区及作用(JDK8) https://blog.csdn.net/BigBug_500/article/details/104734957 java 进程占用系统内存过高分析 https://blog.csdn.net/fxh13579/article/details/104754340 Java之jvm和线程的内存 https://blog.csdn.ne…...
电力系统储能调峰、调频模型研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
C++基础之类、对象一(类的定义,作用域、this指针)
目录 面向对象的编程 类的引入 简介 类的定义 简介 访问限定符 命名规则 封装 简介 类的作用域 类的大小及存储模型 this指针 简介 面向对象的编程 C与C语言不同,C是面向对象的编程,那么什么是面向对象的编程呢? C语言编程,规定…...
javaScript---设计模式-封装与对象
目录 1、封装对象时的设计模式 2、基本结构与应用示例 2.1 工厂模式 2.2 建造者模式 2.3 单例模式 封装的目的:①定义变量不会污染外部;②能作为一个模块调用;③遵循开闭原则。 好的封装(不可见、留接口):①…...
【消息中间件】kafka高性能设计之内存池
文章目录 前言实现创建内存池分配内存释放内存 总结 前言 Kafka的内存池是一个用于管理内存分配的缓存区域。它通过在内存上保留一块固定大小的内存池,用于分配消息缓存、批处理缓存等对象,以减少频繁调用内存分配函数的开销。 Kafka内存池的实现利用了…...
创建型模式——单例(singleton)
1. 模式说明 单例模式保证类只有一个实例;创建一个对象,当你创建第二个对象的时候,此时你获取到的是已经创建过的对象,而不是一个新的对象; 1.1 使用场景 共享资源的访问权限;任务的管理类;数…...
算法:迷宫问题
描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或…...
聊聊并发编程的12种业务场景
前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高。 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景。 毕竟如果使用了多线程&…...
MySQL执行顺序
MySQL执行顺序 MySQL语句的执行顺序也是在面试过程中经常问到的问题,并且熟悉执行顺序也有助于SQL语句的编写。 SELECT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT执行顺序如下: FROM ON JOIN WHERE GROUP BY # (开始使用别名) SUM # SUM等…...
引领真无线耳机未来趋势,NANK南卡OE骨传导真无线耳机惊艳亮相
传统的蓝牙耳机存在很多问题,例如续航时间短、长期佩戴耳朵会不舒服,甚至影响听力等等。为了解决这些问题,在骨传导领域深耕十多年的南卡品牌推出了这款真无线骨传导耳机——NANK南卡 OE。 NANK南卡OE即将正式上线,这一消息一经宣…...
5款写作神器,帮助你写出5w+爆款文案,好用到哭
我不允许还有文案小白、新手博主不知道这5款写作利器! 每次一写文案就头秃的新媒体工作者,赶紧看过来吧!这5款好用到爆的写作神器,喝一杯咖啡的时间就能完成写作。 我和同事都是用它们,出了很多的爆款,现…...
相交链表问题
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
[ubuntu] ax200网卡虚接,导致系统根目录占满而无法进入系统的奇葩问题
20230508,我像往常一样,打开电脑发现根目录满了,报警了,所以按照网上的教程,清理了一下根目录的文件,没想到背后是网卡问题… 文章目录 1.进入终端模式2.查看占用情况3.清理系统log文件3.1 清理/var/log/syslog3.2 清…...
本地字体库的引入方法
本地字体库是指在计算机系统中存储的一组字体文件,通常包含多种字体格式,如TTF、OTF、WOFF等。引入本地字体库可以让用户在使用计算机时可以选择不同的字体,从而提高用户的使用体验。 本地字体库的引入方式有多种,其中比较常用的是…...
7种优秀的导航菜单设计总结
导航是应用程序界面中最常见的模块之一,在链接应用程序中起着每个页面的作用。 不同的设计需求和业务目标决定了导航的设计因品而异,移动设备的尺寸远小于计算机。因此,在设计移动终端导航时,应考虑更全面,以确保简单…...
Problem E. 矩阵游戏 (2023年ccpc河南省赛)
原题链接: https://codeforces.com/gym/104354 题意: 有一个n*m的矩阵,只有三种字符:0,1和?。从[1,1]走到[n,m],每次只能向下走或者向下走。当走到1的时候得一分,走到0的时候不得分,走到?的时候可以将他…...
数字孪生模型构建理论及应用
源自:计算机集成制造系统 作者:陶飞 张贺 戚庆林 徐 俊 孙铮 胡天亮 刘晓军 刘庭煜 关俊涛 陈畅宇 孟凡伟 张辰源 李志远 魏永利 朱铭浩 肖斌 摘 要 数字孪生作为实现数字化转型和促进智能化升级的重要使能途径,一直备受各…...
Vue面试题:30道含答案和代码示例的练习题
Vue中的双向数据绑定是怎么实现的? 双向数据绑定通过使用v-model指令实现。v-model指令会在表单元素上创建一个监听器,在用户输入时实时更新Vue实例的数据,并且在Vue实例数据变化时更新表单元素的值。 如何在Vue中定义一个方法?…...
如何用ExifToolGUI批量管理照片元数据:告别命令行复杂操作
如何用ExifToolGUI批量管理照片元数据:告别命令行复杂操作 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾为几百张旅行照片的拍摄时间错误而烦恼?或者需要为大量图片批量添…...
WorkTool企业微信自动化机器人技术架构解析:基于Android无障碍服务的非侵入式RPA实现
WorkTool企业微信自动化机器人技术架构解析:基于Android无障碍服务的非侵入式RPA实现 【免费下载链接】worktool 一款安全稳定的Android无障碍服务工具,支持控制企微/微信来运行的无人值守群管理企业微信机器人 项目地址: https://gitcode.com/GitHub_…...
从零构建现代化Web组件库:架构设计、开发实践与工程化指南
1. 项目概述:从零到一理解现代Web组件库如果你是一名前端开发者,或者正在构建一个需要大量交互界面的Web应用,那么“组件库”这个词对你来说一定不陌生。今天我们不聊那些耳熟能详的巨头库,而是聚焦于一个更具象、更贴近实际开发场…...
ARM错误记录寄存器架构与RAS扩展解析
1. ARM错误记录寄存器架构概述在ARM架构的可靠性、可用性和可维护性(RAS)扩展中,错误记录寄存器扮演着核心角色。这套机制通过一组精确定义的寄存器,为系统提供了硬件错误的检测、记录和处理能力。作为一位长期从事ARM平台开发的工…...
90年代末至21世纪初黑客工具怀旧:从RAT到IRC,我们学到了什么?
远程管理工具(RAT)的黄金时代一切大约始于1998年,“死亡牛仔崇拜”组织在黑帽大会上发布“后门孔”工具。这名字是对微软BackOffice的有意双关,幼稚又精准,符合该组织风格。它能远程控制Windows 95/98机器,…...
百度网盘Mac版性能优化:深入解析macOS逆向工程技术实践
百度网盘Mac版性能优化:深入解析macOS逆向工程技术实践 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘Mac版性能优化工具是一款基…...
Taotoken API Key安全管理最佳实践与审计日志查看
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken API Key安全管理最佳实践与审计日志查看 对于任何接入大模型服务的开发者而言,API Key 是访问权限的核心凭证…...
HEIF Utility终极指南:在Windows上免费打开和转换苹果HEIF照片的完整教程
HEIF Utility终极指南:在Windows上免费打开和转换苹果HEIF照片的完整教程 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 还在为iPhone拍摄的照片在W…...
pkrelay:轻量级端口转发工具的设计原理与生产实践
1. 项目概述:一个轻量级、高可用的端口转发与流量中继工具在分布式系统、微服务架构以及混合云部署的日常运维和开发调试中,我们经常会遇到一个经典问题:如何安全、便捷地将一个网络环境中的服务端口,暴露给另一个网络环境访问&am…...
终极文档下载神器:一键下载30+平台文档的完整解决方案
终极文档下载神器:一键下载30平台文档的完整解决方案 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解…...
