C++动态数组扩容后输入输出异常问题求助
动态数组扩容后输入输出异常问题分析
我正在做一个项目,其中必须用到动态数组。初始数组最多容纳5个元素,当用户输入的元素数量超过5时会执行扩容操作,但往扩容后的数组输入数据再尝试输出时,结果时好时坏,存在异常。以下是我的代码:
#include <iostream> using namespace std; int main() { int size = 5; int classes; //This is how I created the original array. int* arr = { new int[size] {} }; //this is how my code is working right now cout << "Enter the number of classes: "; cin >> classes; if(classes > size) { size_t newSize = size * 2; int* resize_arr = new int[newSize]; for (int i = 0; i < newSize; i++) { resize_arr[i] = arr[i]; } size = newSize; delete[] arr; arr = resize_arr; } for(int i = 0; i < classes; i++) { cin >> arr[i] } for(int i = 0; i < classes; i++ { cout << arr[i] } return 0; }
问题根源及修正方案
- 扩容循环越界访问:原扩容循环遍历
newSize个元素,但原数组只有size个有效元素,访问arr[5]到arr[newSize-1]属于未定义行为,会读取垃圾值。应将循环条件改为i < size,只复制原数组的有效元素。 - 语法错误:输入循环的
cin >> arr[i]、输出循环的cout << arr[i]末尾缺少分号;输出循环的for语句中i++后缺少右括号,这些都会导致编译失败。 - 单次扩容可能仍不足:如果用户输入的
classes大于扩容后的size(比如输入12,初始size5扩容后是10),依然会出现数组越界。应改为循环扩容直到size >= classes。 - 冗余初始化写法:
int* arr = { new int[size] {} };中的大括号多余,直接写成int* arr = new int[size] {};即可。
修正后的代码
#include <iostream> using namespace std; int main() { int size = 5; int classes; // 创建初始动态数组,初始化所有元素为0 int* arr = new int[size] {}; cout << "Enter the number of classes: "; cin >> classes; // 循环扩容直到数组容量足够 while (classes > size) { size_t newSize = size * 2; int* resize_arr = new int[newSize] {}; // 初始化新数组元素为0 // 仅复制原数组的有效元素 for (int i = 0; i < size; i++) { resize_arr[i] = arr[i]; } delete[] arr; // 释放原数组内存 arr = resize_arr; size = newSize; } // 输入数据到数组 for(int i = 0; i < classes; i++) { cin >> arr[i]; } // 输出数组元素 for(int i = 0; i < classes; i++) { cout << arr[i] << " "; } delete[] arr; // 记得释放动态分配的内存 return 0; }
内容的提问来源于stack exchange,提问作者dwlajdwajdaw
相关产品推荐
相关产品推荐

