假设动态开辟的空间是用来存放int数组的,每个数据的长度为4个字节,那么存放最后一个数据前只剩下的4个字节的长度,如果最后一个数据的长度是8个字节那么就会造成溢出(虽然你知道最后一个数据的长度是4字节但是编译器不知道,也可能你最后从一个double数组挪了一个数据过来那也是8字节会造成溢出)。
此警告的目的是提示我们要在所需的最小空间的基础上加上足够的空间,防止溢出。
这个足够的空间到底多大才算足够?
假设现在malloc了一个tmp,如果要把一个数组arr中的若干元素(不是全部)拷贝到tmp中,那么就需要开辟sizeof(arr)+4个字节(加上4个字节的额外空间,就算把arr中的全部元素都拷贝到tmp中,且最后一个数据的字长为8也不会溢出);如果要把两个数组arr1、arr2中的若干元素(同样不是全部!!)存放到tmp中,那么就需要开辟sizeof(arr1)+sizeof(arr2)+4个字节,只要使用了循环,就算只在arr1、arr2中拷贝一个元素,也需要开辟整个数组的空间,有几个数组参与了循环就要开辟几个数组的sizeof的空间 ---- 编译器不知道你到底要拷贝这些数组中的多少元素,只能做最坏的打算认为你是要把这些数组的所有元素都拷贝进来,而且你可能对循环进行更改导致在数组尚未越界的时候tmp就已经放不下了