You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Buffer-overrun警告原因咨询:C++动态数组扩容代码问题

C6386缓冲区溢出警告的原因及修复

问题背景

编写了一个程序,功能是创建动态数组arr2,将用户输入的新值追加到arr2,同时把原数组arr1的元素复制到arr2中。程序能正常运行,但出现以下警告:

Warning C6386 Buffer overrun while writing to 'arr2': the writable size is 'size*4' bytes, but '8' bytes might be written

同时构建日志还提示main函数返回值的警告:

warning C4326: return type of 'main' should be 'int' instead of 'void'

原代码如下:

#include <iostream>
using namespace std;

void add(int array[], int size, int value);

void main()
{
    int s = 5, v={}, arr1[5] = {1,2,3,4,5};
    
    cout << "\nHere is an array: ";
    for (int i = 0;i < 5;i++)
    {
        cout << arr1[i] << " ";
    }
    
    cout << "\nValue you want to add: ";
    cin >> v;
    add(arr1, s,v);

}
void add(int array[], int size, int value)
{
    size = size + 1;
    int* arr2 = new int[size];

    for (int i = 0;i < 5;i++)
    {
        arr2[i] = array[i];//Warning Occurs here at line 28

    }

    arr2[size - 1] = value;

    cout << "Here is the array with the added value: ";

    for (int i = 0;i < size;i++)
    {
        cout << arr2[i] << " ";
    }

    delete[] arr2;
}

C6386警告的具体原因

这个警告是编译器静态分析工具检测到潜在的数组越界访问风险:

  • 在add函数中,你先把传入的size(原数组长度)加1,创建了长度为size的动态数组arr2(此时size是原长度+1)。
  • 但复制原数组元素时,你用了硬编码的循环条件i < 5,而非基于传入的原数组长度。
  • 静态分析工具会考虑通用场景:如果调用add时传入的size小于5(比如传入size=3),那么arr2的长度是4,循环i <5会尝试访问arr2[3]和arr2[4],其中arr2[4]超出了数组的可写范围(数组索引从0开始,长度为4的数组最大索引是3),这就会触发缓冲区溢出警告。

你当前测试时传入的size是5,所以不会出现实际错误,但工具会预判这种通用场景下的风险。

修复方案

1. 修复C6386警告

复制原数组元素时,使用传入的原数组长度作为循环条件,不要用硬编码的5。可以先保存原size的值,再修改size:

void add(int array[], int size, int value)
{
    int originalSize = size; // 保存原数组长度
    size = size + 1;
    int* arr2 = new int[size];

    for (int i = 0;i < originalSize;i++) // 使用原长度循环
    {
        arr2[i] = array[i];
    }

    arr2[size - 1] = value;

    cout << "Here is the array with the added value: ";

    for (int i = 0;i < size;i++)
    {
        cout << arr2[i] << " ";
    }

    delete[] arr2;
}

2. 修复C4326警告

C++标准要求main函数的返回类型必须是int,将void main()改为int main(),并在函数末尾添加return 0;:

int main()
{
    int s = 5, v={}, arr1[5] = {1,2,3,4,5};
    
    cout << "\nHere is an array: ";
    for (int i = 0;i < 5;i++)
    {
        cout << arr1[i] << " ";
    }
    
    cout << "\nValue you want to add: ";
    cin >> v;
    add(arr1, s,v);

    return 0; // 添加返回语句
}

修复后的完整代码

#include <iostream>
using namespace std;

void add(int array[], int size, int value);

int main()
{
    int s = 5, v={}, arr1[5] = {1,2,3,4,5};
    
    cout << "\nHere is an array: ";
    for (int i = 0;i < 5;i++)
    {
        cout << arr1[i] << " ";
    }
    
    cout << "\nValue you want to add: ";
    cin >> v;
    add(arr1, s,v);

    return 0;
}

void add(int array[], int size, int value)
{
    int originalSize = size;
    size = size + 1;
    int* arr2 = new int[size];

    for (int i = 0;i < originalSize;i++)
    {
        arr2[i] = array[i];
    }

    arr2[size - 1] = value;

    cout << "\nHere is the array with the added value: ";
    for (int i = 0;i < size;i++)
    {
        cout << arr2[i] << " ";
    }

    delete[] arr2;
}

内容的提问来源于stack exchange,提问作者Sleek Cheems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:17:14