这是我的代码:
#include<iostream>
#include<cstdlib>
using namespace std;
int main() {
int** arr=NULL;
int num=0;
cin >> num;
int* big=NULL;
arr = new int*[num];
for (int i = 0; i < num; i++) {
arr[i] = new int[5];
}
big = new int[num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < 5; j++) {
while (1) {
cin >> arr[i][j];
if (arr[i][j] >= 0 && arr[i][j] < 100)
break;
}
}
}
for (int i = 0; i < 5; i++) {
big[i] = 0;
}
for (int i = 0; i < num; i++) {
for (int j = 0; j < 5; j++) {
if (big[i] < arr[i][j]) {
big[i] = arr[i][j];
}
}
}
for (int i = 0; i < num; i++) {
cout << "Case #" << i + 1 << ": " << big[i] << endl;
}
delete[]big;
for (int i = num-1; i>=0; i--) {
delete[]arr[i];
}
delete[]arr;
return 0;
}
运行此代码时,它说有堆损坏错误(检测到堆损坏)。我认为这意味着我的代码中“新”或“删除”部分存在一些错误,但我找不到它们。我希望有人回答。谢谢。
答案 0 :(得分:3)
在代码的许多地方,您正在使用从0到5的索引来索引big
数组,而使用用户输入来分配数组,例如,如果用户输入是4
,则您的代码是未定义的行为。
如果您使用的是c ++,则不应该手动分配数组,而应使用std::vector
,它将为您管理内存,因此您不必new
和delete
来回忆自己。
使用std::vector
,您的代码将看起来像这样。
std::vector<std::vector<int>> arr;
std::vector<int> big;
cin>>num;
arr.resize(num, std::vector<int>(5));
big.resize(5);
您还可以使用at
方法在进行边界检查时访问元素,还可以使用size
方法来获取数组元素的数量。
答案 1 :(得分:3)
错误在这里:
big = new int[num];
...
for (int i = 0; i < 5; i++) {
big[i] = 0;
}
因此,当num
小于5时,您将在数组之外进行写操作。
无论如何,您都在使用C ++,因此请使用vector执行此类任务。
#include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;
int main() {
vector<vector<int>> arr;
int num=0;
cin >> num;
arr.resize(num, vector<int>(5));
for (auto &row : arr) {
for (auto &cell : row) {
while (1) {
cin >> cell ;
if (cell >= 0 && cell < 100)
break;
}
}
}
vector<int> big(arr.size());
for (int i = 0; i < arr.size(); i++) {
for (auto &cell : arr[i]) {
if (big[i] < cell) {
big[i] = cell;
}
}
}
for (int i = 0; i < num; i++) {
cout << "Case #" << i + 1 << ": " << big[i] << endl;
}
return 0;
}