C++实现数组从大到小排序生成新数组输出异常问题求助
问题排查
- 核心错误为数组定义时机错误:你在读取
size的值之前就用未初始化的size定义了两个数组,此时size是内存中的随机垃圾值,数组长度和你后续输入的长度完全不符,后续读写数组元素属于越界访问,直接导致数据错乱,这也是你测试时只能拿到最后一个最大值、其余都是0的原因。 - 次要逻辑缺陷:
max初始值设为0,如果待排序数组包含负数,排序逻辑会直接失效;同时用0标记已取出的元素也会和数组中合法的0元素冲突。
修复方案
使用标准C++的std::vector作为动态数组容器,避免可变长度数组的兼容性问题,同时调整初始化逻辑适配所有整数场景,修复后的代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int size, sum = 0, pos, max; // 先读取长度再创建对应大小的容器 cin >> size; vector<int> array(size); vector<int> array2(size); for (int i = 0; i < size; i++) { cin >> array[i]; sum += array[i]; } for (int i = 0; i < size; i++) { // 用int最小值作为初始值,兼容负数场景 max = -2147483648; pos = 0; for (int q = 0; q < size; q++) { if (array[q] > max) { max = array[q]; pos = q; } } array2[i] = max; // 用int最小值标记已取过的元素,避免和合法的0冲突 array[pos] = -2147483648; } for (int i = 0; i < size; i++) { cout << array2[i] << ", "; } return 0; }
用你提供的测试用例运行后,输出为5, 4, 3, 2, 1, ,符合预期。
内容的提问来源于stack exchange,提问作者Qussai Algazawi
相关产品推荐
相关产品推荐

