C语言:内存重叠问题

来源:互联网 发布:mac b站 编辑:程序博客网 时间:2024/05/22 05:22
本文通过一个例子来说明一下关于内存重叠问题的分析与解决方案,大家一起学习学习吧。
1.题目:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。如下图:



void Move(int *arr, int n, int m)//n表示数组长度,m表示需要移到的后半段的数据长度
{
    if(arr ==NULL || n <= 0 || m < 0 || n < m)//首先是判断满足题目的条件
    {
       return;
    }

    int *p =(int *)malloc(m * sizeof(int));//创建动态内存,将后m个数据复制过去
    int i;
    for(i = 0; i< m; i++)
    {
       p[i] = arr[n- m + i];
    }

    for(i = n - m - 1; i >= 0;i--)//将前面(n-m)个数据向后移  (解决方案
    {
       arr[i + m] =arr[i];
   }


    for(i = 0; i< m; i++)//将后m个数据复制到前面
    {
       arr[i] =p[i];
    }

   free(p);//释放内存p
}

在上面绿色段的过程就有可能出现内存重叠问题,看下面代码
for(i = 0; i < n -m; i++)
{
    arr[i + m] =arr[i];
}
如果上面代码改为红色代码,程序运行结果会是:1 2 3 1 2 3 1


2.内存重叠问题列举
当数组进行拷贝的时候,如果是在同一个数组内拷贝,就有可能出现内存重叠的问题。
void Move2(int *des, int *src, intlen)//从src拷贝到des,len是需要拷贝的数据个数
    for(int i =0; i < len; i++)
    {
       des[i] =src[i];
    }
}
void Show(int *arr, int len)
{
    for(int i =0; i < len; i++)
    {
       printf("%d", arr[i]);
    }
   printf("\n");
}
int main()
{
   //(1)从一个数组拷贝到另一个数组,ok
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    intbrr[10];
    Move2(brr,arr, 10);
    Show(arr,sizeof(arr) / sizeof(arr[0]));
    Show(brr,sizeof(brr) / sizeof(brr[0]));


   //(2)内存重叠1,ok
   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]));


   
//(3)内存重叠2,error
    intarr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   Move2(&arr[3], &arr[0], 7);
    Show(arr,sizeof(arr) /sizeof(arr[0]));

   
    return 0;
}

上面程序的运行结果分别是:
(1) 1 2 3 4 5 6 7 8 910
(2) 4 5 6 7 89 10 8 9 10
(3) 1 2 3 1 2 3 1 2 3 1
分析错误③:

a[0]复制到a[3]过程中,将原来a[3]的值覆盖,后面依次覆盖a[4]、a[5]…,使得运行结果和预想不一致。

3.处理措施:
 如何判断有内存重叠问题?
 看地址,看目标地址和源地址。

(1)当源内存的首地址大于目标内存的首地址时,实行正向拷贝;
(2)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 真空杯不保温了怎么办 锅底外面烧黑了怎么办 锅底里面烧黑了怎么办 佳能50镜头跑焦怎么办 g7x镜头进灰了怎么办 leica镜头进灰了怎么办 请问喉咙痒咳嗽该怎么办 喉咙痒咳嗽有痰怎么办 痒咳嗽停不下来怎么办 嗓子疼咳嗽有痰怎么办 上火了喉咙干痒怎么办 喉咙里总是有痰怎么办 1岁宝宝喉咙有痰怎么办 嗓子总感觉有痰怎么办 嗓子痒感觉有痰怎么办 1岁宝宝嗓子有痰怎么办 3岁宝宝嗓子有痰怎么办 喉咙总感觉有痰怎么办 感冒了喉咙有痰怎么办 咽喉有异物感是怎么办 老感觉喉咙有痰怎么办 感冒有痰怎么办最有效 感冒快好了有痰怎么办 喉咙里一直有痰怎么办 一到晚上就咳嗽怎么办 1岁宝宝咳嗽痰多怎么办 3岁宝宝咳嗽痰多怎么办 六岁儿童咳嗽有痰怎么办 很多白痰在喉咙怎么办 我喉咙总是有痰怎么办 喉咙老感觉有痰怎么办 喉咙痒老是有痰怎么办 抽烟多了嗓子疼怎么办 抽烟多了老咳嗽怎么办 抽烟抽多了咳嗽怎么办 嗓子咳出异物臭怎么办 鼻子有鼻涕喉咙有痰怎么办 怀孕39周感冒了怎么办 一口痰卡在喉咙怎么办 鼻塞黄鼻涕黄痰怎么办 小孩咳嗽流黄鼻涕怎么办