c语言学习之内存重叠

来源:互联网 发布:淘宝女式长袖衬衣 编辑:程序博客网 时间:2024/06/05 23:55

    遇到这样一个问题,当数组进行拷贝的时候,如果是在同一个数组内拷贝,就有可能出现内存重叠的问题,比如

#include<stdio.h>void Copy(int *a, int  *b,int len)//b从开始复制len个数字到a{    int i ;                      //为了更突出问题,这里不进行参数检查    for (i = 0; i < len; i++)    {        a[i] = b[i];    }}int main(){    int i;    int  arr[10] = {1,2,3,4,5,6,7,8,9,10};    Copy(&arr[0], &arr[3], 7);       //4,5,6,7,8,9,10,8,9,10    for (i = 0; i < 10; i++)    {        printf("%d ", arr[i]);    }    return 0;}
结果也正确

但是当我们这样写

#include<stdio.h>void Copy(int *a, int  *b,int len)//b从开始复制len个数字到a{int i ;                      //为了更突出问题,这里不进行参数检查for (i = 0; i < len; i++){a[i] = b[i];}}int main(){int i;int  arr[10] = {1,2,3,4,5,6,7,8,9,10};Copy(&arr[3], &arr[0], 7);       //1,2,3,1,2,3,4,5,6,7for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;}

原意是想输出1,2,3,1,2,3,4,5,6,7,但是当我们运行的时候却发现是这样

这就是内存重叠的问题了,因为在我们复制的时候,我们自身的值被覆盖所以就导致重复出现123的问题了。

在这样的情况下,我们应该反向复制元素,就是从最后一个元素往前复制

void Copy(int *a, int  *b,int len)//b从开始复制len个数字到a{int i ;                      //为了更突出问题,这里不进行参数检查for (i = len-1; i >= 0; i--){a[i] = b[i];}}

所以我们复制的时候需要分两种情况,一种是原数组在目标数组后,一种是原数组在目标数组前面,而且我们还要考虑是否有内存重叠的部分,所以我们应该这么做

void Copy(int *a, int  *b,int len)//b从开始复制len个数字到a{int i ;                      if ((abs(b - a) < len) && b < a)  //判断有重叠部分并且目标数组在后面实行反向复制{for (i = len - 1; i >= 0; i--){a[i] = b[i];}}else                             //正常复制{for (i = 0; i < len; i++){a[i] = b[i];}}}

以上就是我对内存重叠的理解。


原创粉丝点击