有关内存覆盖

来源:互联网 发布:数据挖掘需要什么基础 编辑:程序博客网 时间:2024/06/05 05:31

例题:有n个整数,使前面各数顺序向后移动m个位置,最后m个数变成最前面的m个数。写一个函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。

如下图:

#include<stdio.h>#include<stdlib.h>void Move(int *arr,int n,int m)   {   if(arr==NULL || n<=0 || m<0 || n<m)     //判断问题不成立的条件   {      return ;   }   int *p = (int *)malloc(m*sizeof(int));  //申请动态数组   int i;   for(i=0;i<m;i++)                           {      p[i] = arr[n-m+i];                   //将m个数移动到新申请的动态数组中   }   for(i=n-m-1;i>=0;i--)   {      arr[i+m] = arr[i];                   //将原来的数组往后移动m个位置   }   for(i=0;i<m;i++)   {      arr[i] = p[i];                       //将动态数组中m个数移动到原来数组中的最前面   }   free(p);                                //释放内存 否则内存泄漏}void Show(int *arr,int len){   for(int i=0;i<len;i++)   {      printf("%d ",arr[i]);   }   printf("\n");}int main(){   Show(arr,sizeof(arr)/sizeof(arr[0]));   int arr[10] = {1,2,3,4,5,6,7,8,9,10};   Move(arr,sizeof(arr)/sizeof(arr[0]),3);   Show(arr,sizeof(arr)/sizeof(arr[0]));   return 0;}


内存重叠问题:
#include<stdio.h>#include<stdlib.h>void Move2(int *des,int *src,int 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从一个数组拷贝到另一个数组int arr1[10] = {1,2,3,4,5,6,7,8,9,10};int brr[10];Move2(brr,arr1,10);Show(arr1,sizeof(arr1)/sizeof(arr1[0]));Show(brr,sizeof(brr)/sizeof(brr[0]));//内存重叠int arr2[10] = {1,2,3,4,5,6,7,8,9,10};Move2(&arr2[0],&arr2[3],7);Show(arr2,sizeof(arr2)/sizeof(arr2[0]));int arr3[10] = {1,2,3,4,5,6,7,8,9,10};Move2(&arr3[3],&arr3[0],7);Show(arr3,sizeof(arr3)/sizeof(arr3[0]));return 0;}


















原创粉丝点击