C/C++写入到““时缓冲区溢出:可写大小为““个字节,但可能写入了“8“个字节。

        假设动态开辟的空间是用来存放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就已经放不下了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值