内存重叠_沉浸在在代码世界的小小程序猿_新浪博客

内存重叠:浅拷贝就是一个很好的例子
//从src拷贝到des,len是需要拷贝的数据个数
void Move(int *des,int *src,int len)
{
for( i=0;i
{
des[i] = src[i];内存重叠
}
}
void Show(int *arr,int len)
{
 for(int i=0;i
 {
  printf("%d ",arr[i]);
 }
 printf("\n");
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Move2(&arr[0],&arr[3],7);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
这是从前往后拷贝,会出现内存重叠,即得到的结果不是预期的结果而是1231231231
应先断言,然后进行反拷贝,即修改如下:
void Move(int *des,int *src,int len)
{
assert(*des!=NULL && *src!=NULL);
des+=len-1;
src+=len-1;
while(len--)
{
des[i]=src[i];
i--;
}
}
//写一个打印函数,将拷贝后的数据打印出来
void Show(int *arr,int len)
{
for(int i=0;i
{
printf("%d ",arr[i]);
}
printf("\n");
}
//在主函数中调用
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
Move(&arr[0],&arr[3],7);
Show(arr,sizeof(arr)/sizeof(arr[0]));

return 0;
}
此时的结果极为正确结果:1231234567
上述是考虑了肯定会出现内存重叠的问题,若未出现,应加入一个if语句,没有内存重叠,还可以从前往后拷贝
if(des<=src||des>=src+len)
{
while(len--)
{
des[i] = src[i];
i++;
}
}
则这就是完善的比较完整。
综述:在进行字符串的拷贝,比较等一系列的问题时,都应该加上断言,考虑内存重叠的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值