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

为何最后一行cout无法输出数组?程序返回值异常求助

动态数组内存越界问题的解决

输入9,-9,9.9,-9.9这类数值时,程序无法输出数组内容,且返回值为3221226356,原代码如下:

#include <iostream>
using namespace std;

int main(){
    double unos;
    int N = 1;
    double *arr = new double [N];
    int counter = 0;
    
    //unesi arr (prekida se ako 0)
    do{
        cin >> unos;
        if (unos != 0){
            arr[counter] = unos;
            counter ++;
        }
    }while(unos != 0);
    
    
    //isprintaj arr
    cout << "Array na unosu: "<< endl;
    for (int i = 0; i < counter; i++){
        cout << arr[i] << " ";
    }
    
    delete[] arr;
    return 0;
}

问题根源

程序触发了内存越界访问:初始仅分配了1个double大小的内存空间,但输入多个非0值时,counter会持续增长,当counter >= N时,arr[counter]会访问到分配内存之外的区域,这属于未定义行为,直接导致程序崩溃、无法正常输出,返回的3221226356是Windows系统下内存访问错误的标志性代码。

解决方案

方案1:手动实现动态扩容

每次数组存满时,重新分配更大的内存空间,复制旧数据后释放原内存:

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    double unos;
    int N = 1;
    double *arr = new double[N];
    int counter = 0;
    
    do{
        cin >> unos;
        if (unos != 0){
            // 检查是否需要扩容
            if (counter >= N){
                // 扩容为原大小的2倍
                int new_N = N * 2;
                double *new_arr = new double[new_N];
                // 复制旧数组内容到新数组
                copy(arr, arr + N, new_arr);
                // 释放旧内存
                delete[] arr;
                // 更新数组指针和大小
                arr = new_arr;
                N = new_N;
            }
            arr[counter] = unos;
            counter++;
        }
    }while(unos != 0);
    
    cout << "Array na unosu: "<< endl;
    for (int i = 0; i < counter; i++){
        cout << arr[i] << " ";
    }
    
    delete[] arr;
    return 0;
}

方案2:使用STL的vector(推荐,适合开发初期)

vector会自动管理内存扩容,无需手动处理new/delete,代码更简洁安全:

#include <iostream>
#include <vector>
using namespace std;

int main(){
    double unos;
    vector<double> arr;
    
    do{
        cin >> unos;
        if (unos != 0){
            arr.push_back(unos); // 直接添加元素,vector自动扩容
        }
    }while(unos != 0);
    
    cout << "Array na unosu: "<< endl;
    for (double num : arr){
        cout << num << " ";
    }
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Petar Horvat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:20