【C语言】关于内存重叠问题


//一个数组,一共有m个,需要把后面n个移动到最前面
#include <stdio.h>
#include <stdlib.h>

void Move(int *arr,int n,int m)
{
	int i;
	int *str = (int *)malloc(m*sizeof(int));//申请一个和需要被移动数组一样个数的动态内存

	for (i = 0 ; i<m ; i++)//第一步:把数组后面的n个字移动到另一个数组里
	{
		str[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] = str[i];
	}

	for (i = 0 ; i<n ; i++)
	{
		printf ("%d ",arr[i]);
	}
	printf ("\n");

	free(str);
}

int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10};
	Move(arr,sizeof(arr)/sizeof(arr[0]),3);
	return 0;
}



当需要移动的数字个数m小于总数组数n时,只能根据图二的情况一来判断;

当需要移动的数字个数m大于等于总数组数n时,就可以依据图二的情况二来判断。

图三就是我们所说的”内存重叠“问题,如果遇到需要移动的数字个数m小于总数组数n时,就要考虑这个问题,仿照最上面的例题,解决”内存重叠“的问题。


!!!注意!!!一定不要越界!!!

猜你喜欢

转载自blog.csdn.net/weixin_41576955/article/details/80294579