内存重叠:拷贝的目标地址在源地址范围内,即拷贝的目标地址和源地址有重叠。
就一个例子来进行展开:
现有一整型数组arr[10] = {1,2,3,4,5,6,7,8,9,10},要求将其拷贝到整形数组brr[10]当中去,这是很简单的,类似于字符串的拷贝,但是同时又与之有区别。如果现在我们选择将从arr[4]开始将6个元素拷贝到从arr[0]开始的位置,这样将会出现怎样的结果呢?再有,选择将从arr[0]开始的6个元素拷贝到从arr[4]开始的位置,又该怎样呢?这两个问题就引出了“内存重叠”的话题了。
从第一个问题开始分析。
我们可以看到,中间的arr[4]和arr[5]是重叠部分,这时的拷贝方式是从前往后拷贝的,与字符串的拷贝方式并没有多大差别,可是,再想想,如果从arr[9]开始从后往前拷贝呢?那么这时,arr[4]和arr[5]被arr[8]、arr[9]覆盖,那么arr[4]和arr[5]的数据被覆盖了,显然得到的结果就不是我们想要的了。
正确结果(标红的地方)及图如下(图中的数字表示的是下标):