内存重叠

来源:互联网 发布:豆人网络战争前线 编辑:程序博客网 时间:2024/06/05 02:19

内存重叠问题

 

首先,有这样一道题:

n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。

代码:

void Move(char *arr,int m)

//n个整数,前面各数顺序后移m个位置,最后m个数变成前m个数

{

char brr[100]="";

int len=strlen(arr);

int i;

for(i=0;i<len-m;i++)

{

brr[i]=arr[i+m];

}

for(;i<len;)

{

for(int j=0;j<m;j++,i++)

{

brr[i]=arr[j];

}

}

printf("%s\n",brr);

}

int main()

{

char *arr="123456789";

Move(arr,4);

return 0;

}

示意图:

 


这个还是比较好实现的,但是当问题变成这样:

移动后m个到前面去,如图

 

代码:

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()

{

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;

}

这个也还好,省去了把前n-m个格子放到后面

但当问题变为

移动前m个到后面去,如图:

 

这个时候就要注意了,当你赋值的时候,arr[0]赋值给arr[3]arr[1]赋值给arr[4]arr[2]赋值给arr[5],但当arr[3]arr[6]赋值是便会出错,因为你第一步赋值的时候更改了arr[3]的值,这就是内存重叠。

对于内存重叠,我所想的办法是新创建一个数组,把要移动的部分赋值到相应的位置,然后再把剩余的赋值,再复制回原数组,

代码:

void Move3(int *arr,int n,int m)          //n数组长度,m往后移几个

{              

int i;

int j;

int *p = (int *)malloc(m*sizeof(int));

for(i=m,j=0;j<n,i<n;i++,j++)

{

p[i]=arr[j];

}

for(i=0,j=0;j<m,i<m;i++,j++)

{

p[i]=arr[j];

}

for(i=0;i<n;i++)                    //把移好的复制过来

{

arr[i] = p[i];

}

}

但这个是借助了另一个数组,只用一个数组就需要判断地址了,对于这个方法,我没有写出来,等写出来再做修改。

原创粉丝点击