为何最后一行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
相关产品推荐
相关产品推荐

