VS2019: C6386 警告的解决方案(写入到“nWord“时缓冲区溢出:可写大小为“nTotal*4“个字节,但可能写入了“8“个字节)

使用了求助者的代码作为例子,编译器提示C6386警告

#include<iostream>
using namespace std;

unsigned int nNumItems = 0;

int main()
{
    int* nWords = nullptr;
    unsigned int nTotal;

    nTotal = 3 + 2 * nNumItems;
    nWords = new int[nTotal];

    nWords[0] = 1;
    nWords[1] = 2; // this is line 18, warning C6386

    delete[] nWords;
    return 0;
}

警告具体内容如下:

 提示在堆区开辟空间时,缓冲区溢出。

写入到"nWord"时缓冲区溢出:可写大小为"nTotal*4"个字节,但可能写入了"8"个字节。

在官方文档中,该警告常见于存储的数据个数超过数组上限,产生溢出。但这显然与此代码中产生的问题不符,经过多次修改尝试和运行,我认为该警告源于单纯的代码审查错误,无法判断nTatal的内容和大小。

可以修改产生警告的代码顺序,将nTotal的定义置于堆区开辟之后,解决方案如下:

    nWords = new int[3 + 2 * nNumItems];
    nTotal = 3 + 2 * nNumItems;

 修改后,不再提示该警告。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值