内存重叠

来源:互联网 发布:navicat for linux 64 编辑:程序博客网 时间:2024/06/05 04:12
内存重叠要考虑拷贝数据的方向。
往前移,先移动前面的数据;
往后移,先移动后面的数据。

eg:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//n表示数组长度
//m表示需要移到的后半段的数据长度
(把数组中后m个数据放到数组最前面)
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];
}

for(i=n-m-1;i>=0;i--)
//向后移,先移后面的数据
避免移动数据时,覆盖原始数据

{
arr[i+m] = arr[i];
}

for(i=0;i<m;i++)
{
arr[i] = p[i];
}

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]));
Move(arr,sizeof(arr)/sizeof(arr[0]),3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
//输出:8 9 10 1 2 3 4 5 6 7

return 0;
}