内存重叠:浅拷贝就是一个很好的例子
//从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");
}
{
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]));
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++;
}
}
则这就是完善的比较完整。
综述:在进行字符串的拷贝,比较等一系列的问题时,都应该加上断言,考虑内存重叠的问题。