内存重叠以及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;
}
热门推荐
将星同羊刃:命理中的权力与凶险交织
民事诉讼中当事人享有哪些诉讼权利与义务
南越武帝赵佗:第一个在越南称皇帝的中国人
微短剧后期制作之剪辑技巧
南阳市宛城区:志愿红”守护“钱袋子” 筑牢群众“防骗墙”
投资组合管理:如何定期审查和调整你的投资组合
通货膨胀预期对黄金价格的影响分析
被执行人的法律地位及其在执行程序中的角色
中筋面粉适合做什么?有何独到之处?为何能成为厨房多面手?
音响设备电流声的消除方法:从设备检查到环境优化的全方位解决方案
如何发现市场的热点话题
别吵了!属相到底按“春节”换还是“立春”换,终于有答案了
来了!通州地铁S6、M102,最新进展!
遇到极端车辆冲撞情况,如何避险自救?
电池健康度80%,iPhone还能再战吗?
如何找到高质量信息源?
公积金贷款和商贷都是如何计算贷款额度的,买房贷款额度不够怎么办
如何正确进行104乘以5的验算?
如何利用笛卡尔积提高数据分析的效率与准确性
房价到底什么时候跌?如何了解房地产市场的趋势?
“Troop”:从军事到日常,一个单词的奇妙演变之旅
房屋买卖合同书怎样写法?农村回迁房买卖协议合同有效吗?
结石如何正确饮食预防
金吉拉猫价格、个性、寿命及饲养指南:全面了解这种高贵猫咪的优缺点
运动性脑震荡应对与康复全解析:症状识别、处理措施及预防重要性探讨
东南亚电商十大热销产品排名:从3C到地方特色零食
经典无氧运动6个动作
解析胸部CT:认识不同类型的胸部CT
城市的商业创新怎样推动经济增长?如何培育新的商业增长点和发展动力?
为什么考研复试要提前准备