浅聊内存重叠
来源:互联网 发布:php socket 编辑:程序博客网 时间:2024/05/22 06:14
内存重叠:拷贝的目标地址在源地址范围内,即拷贝的目标地址和源地址有重叠。
就一个例子来进行展开:
现有一整型数组arr[10] = {1,2,3,4,5,6,7,8,9,10},要求将其拷贝到整形数组brr[10]当中去,这是很简单的,类似于字符串的拷贝,但是同时又与之有区别。如果现在我们选择将从arr[4]开始将6个元素拷贝到从arr[0]开始的位置,这样将会出现怎样的结果呢?再有,选择将从arr[0]开始的6个元素拷贝到从arr[4]开始的位置,又该怎样呢?这两个问题就引出了“内存重叠”的话题了。
从第一个问题开始分析。
我们可以看到,中间的arr[4]和arr[5]是重叠部分,这时的拷贝方式是从前往后拷贝的,与字符串的拷贝方式并没有多大差别,可是,再想想,如果从arr[9]开始从后往前拷贝呢?那么这时,arr[4]和arr[5]被arr[8]、arr[9]覆盖,那么arr[4]和arr[5]的数据被覆盖了,显然得到的结果就不是我们想要的了。
正确结果(标红的地方)及图如下(图中的数字表示的是下标):
void Move(int *des,int *src,int len)//len是要拷贝的src的个数
{
if(des>src&& (src+len) > des) //出现内存重叠
{
for(inti=len-1;i>=0;i--)
{
des[i]= src[i];//从后面开始拷贝
}
}
else if(des<=src && des+len > src)//出现内存重叠
{
for(int i=0;i<len;i++)
{
des[i] = src[i];//从前面开始拷贝
}
}
}
Int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Move(&arr[0],&arr[4],6);
for(int i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
程序结果如下:
再看第二个问题,中间的arr[4]和arr[5]是重叠部分,这时的拷贝方式是从后往前拷贝的,这就要与上面的情况有所区分了。如果采用从前往后的拷贝方式的话,arr[4]和arr[5]将被arr[0]和arr[1]给覆盖掉,所以从后往前拷贝可以避免这个问题,在最后才给arr[4]和arr[5]赋值。
正确结果(标红的地方)及图如下(图中的数字表示的是下标):
void Move(int *des,int *src,int len)//len是要拷贝的src的个数
{
if(des>src && (src+len) > des) //出现内存重叠
{
for(int i=len-1;i>=0;i--)
{
des[i] = src[i];//从后面开始拷贝
}
}
else if(des<=src && des+len> src)//出现内存重叠
{
for(inti=0;i<len;i++)
{
des[i]= src[i];//从前面开始拷贝
}
}
}
Int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Move(&arr[4],&arr[0],6);
for(inti=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
程序结果如下:
所以最后总结得:发生内存重叠有两种情况。
des>src && (src+len)> des:从后往前拷贝。
des<=src && des+len > src:从前往后拷贝。
以上内容是我的一些比较浅显的归纳,在查找资料的时候,有看到关于srecpy()和memmove()的内容,日后有机会我也会进行补充。
- 浅聊内存重叠
- 内存重叠
- 内存重叠
- 内存重叠
- 内存重叠
- 内存重叠
- memcpy 内存重叠问题
- memcpy内存重叠问题
- C++中“内存重叠”
- 约瑟夫环、内存重叠
- 粗浅讨论内存重叠
- C语言:内存重叠
- memcpy内存重叠的解决
- 有关内存重叠的问题
- memmove函数与内存重叠
- 内存重叠之strcpy&memmove
- C语言:内存重叠问题
- 手动实现memcpy涉及内存重叠与不重叠情况
- html空元素
- Centos7使用yum方式安装nginx
- MySQL命令行导出数据库
- WOJ1011-Finding Teammates
- Unity Shader自我学习笔记1
- 浅聊内存重叠
- MATLAB 史上最全的资料
- iOS 上传图片方法总结
- Hadoop集群搭建1Master、3Slaves
- Navicat Premium连接MySql失败,提示2003错误
- 读写锁接口实例-通过ReadWriteLock实现一个简单的缓存
- box-shadow
- poj 3083
- 多层神经网络BP算法 文本垃圾分类