内存重叠以及memcpy和memmove函数详解
创作时间:
作者:
@小白创作中心
内存重叠以及memcpy和memmove函数详解
引用
CSDN
1.
https://blog.csdn.net/m0_73537205/article/details/140374579
内存重叠
当我们进行内存拷贝(memcpy函数)时或者在自己实现内存拷贝函数strcpy时,如果存在目标地址在原地址的范围内就造成了内存重叠。经过学习,我们可以利用以下的例子来说明内存重叠问题。
首先,先介绍一下memcpy和memmove函数
void *memcpy( void *dest, const void *src, size_t count );
void *memmove( void* dest, const void* src, size_t count );
- memcpy和memmove函数都是用于从src拷贝count个字节到dest。
- 但是,如果目标区域和源区域有重叠的话:memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖,并且memcpy会出现错误。memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝。
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝。
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝。
接下来,借助于memcpy函数来说明内存重叠
memcpy(void *dest, void *src, size_t num) 是将src指向的地址中的num个字节拷贝到dest目标地址中。假设我们需要拷贝六个字节到dest内存地址中,根据dest和src的关系,内存拷贝可以分为以下三类:
情况一:
目标地址与源地址没有任何重叠,即dest 地址> src地址 + 6或者dest 地址< src地址 - 6:
- 这时,不会造成内存重叠,直接从左到右进行拷贝即可
情况二:
src地址 - 6< dest 地址< src地址:
这时即使会覆盖掉src的部分内存,但是并不会造成内存重叠。
情况三:
目标地址dest位于原地址的内存范围之内,即src 地址< dest 地址< src地址 + 6,这时进行内存拷贝,情况如下:
此时如果对src进行从左到右的内存拷贝,当该拷贝4的时候,此时原先src部分4的内存已经被1给覆盖掉了,就产生了拷贝错误。
解决:
- 如果存在内存重叠,就从高地址进行拷贝
- 自己实现的memcpy如下:
char *my_memcpy(char *dst, const char* src, int cnt)
{
assert(dst != NULL && src != NULL);
char *ret = dst;
/*内存᯿叠,从⾼地址开始复制*/
if (dst >= src && dst <= src+cnt-1)
{
dst = dst+cnt-1;
src = src+cnt-1;
while (cnt--)
{
*dst-- = *src--;
}
}
else //正常情况,从低地址开始复制
{
while (cnt--)
{
*dst++ = *src++;
}
}
return ret;
}
热门推荐
基于Verilog的7段数码管动态扫描驱动模块设计
COB灯带有哪些种类?全面解析COB灯带分类及应用
怎么正确使用车辆的车灯功能?使用车灯功能时需要注意哪些方面?
香港输入法的独特魅力:仓颉、速成与手写
智能定投进阶:移动平均成本法详解
防治肾结石,可以这样“吃”和“做”
右肾疼痛的原因及应对方法
儒林外史中娄家公子的形象如何?他有怎样的事迹?
蛋白胨:定义、来源及其在多个领域的应用
牛肉膏蛋白胨培养基制备
什么是PFC?基于优先级的流量控制技术详解
你是否害怕睡觉?关于“睡眠恐惧症”的原因与治疗
PCB设计安规丨电气间隙与爬电距离要点
美国防晒霜使用者的 5 个秘密
提升个人效能之道:实用策略与技巧详解
车辆维修费用全解析:从工时费到材料费
汽车维修工时费计算全解析:以宝马和凯迪拉克为例
云厂商的DeepSeek大捷
兼职合同网上签订的法律效力及合规要点
全球股市暴跌,A股也没扛住,创业板指大跌9.74%,超5200只个股下跌!
A股大跌之际!重磅数据十分罕见的盘中发布,央行又出手了
如何理解股票大跌的原因?这些原因分析对投资决策有何帮助?
为什么总是嘴馋想吃某种东西?可能是因为身体发生了这些变化
为什么二叉树的前序遍历和中序遍历对应入栈和出栈次序
掌握这些 UI 交互设计原则,提升产品易用性
解读:新型电力系统的“南网模式”是如何构建的?
工厂危险区域怎么管理好
赵云为何在姜维面前大惊失色?天水之战揭秘常胜将军的惊愕
质量管理是干啥的?QA、QC、QE有什么区别?
徐州十大必吃美食,从地锅鸡到蛙鱼,你尝过几个?