C++控制台打印数组时输出异常数值的问题求助
C++排序程序结果不稳定问题排查
问题描述
刚正式入门C++,此前一直搁置学习。编写的程序本应接收整数存入数组并排序,但结果不稳定——有时正常输出有序数组,有时乱序,甚至会出现接近整数上下限的异常正负值。怀疑和数组指针有关,但对指针了解不多,尝试过硬编码数组值、更换排序算法,均无法解决问题。
问题代码
#include <iostream> /*Sorting program*/ using namespace std; int* sortArray(int* array, int size) { for (int i = 0; i < size; i++) { int lowest; for (int k = i; k < size; k++) { if (array[k] < array[i] && array[k] < array[lowest]) { cout << array[k] << " is less than " << array[i] << endl; lowest = k; } } int temp = array[lowest]; array[lowest] = array[i]; array[i] = temp; } return array; } int main() { int low, high, target, size; cout << "Enter size of array : "; cin >> size; int *array = new int[size]; for (int i = 0; i < size; i++) { cout << "Enter array[" << i << "] : " << endl; int entry; cin >> entry; array[i] = entry; } array = sortArray(array, size); for (int i = 0; i < size; i++) { cout << "array[" << i << "] = " << array[i] << endl; } return 1; }
运行输出示例
第一次输出
>>OutputFile.exe Enter size of array : 4 Enter array[0] : 3 Enter array[1] : 4 Enter array[2] : 7 Enter array[3] : 4 array[0] = 2059292487 array[1] = 3 array[2] = 4 array[3] = 7
第二次输出(无修改重新运行)
>>OutputFile.exe Enter size of array : 8 Enter array[0] : 3 Enter array[1] : 4 Enter array[2] : 8 Enter array[3] : 1 Enter array[4] : 88 Enter array[5] : 4 Enter array[6] : 5 Enter array[7] : 6 array[0] = 1 array[1] = 3 array[2] = 4 array[3] = 4 array[4] = 5 array[5] = 6 array[6] = 8 array[7] = 88
问题分析与解决
你的问题和指针无关,核心是未初始化lowest变量,导致其值为内存随机垃圾值,触发未定义行为。
具体问题点
sortArray函数中,int lowest;仅声明变量未赋值,初始值是内存中随机残留的数据。- 内层循环中访问
array[lowest]时,会读取随机内存地址的内容:若随机值恰好是合法数组索引,程序可能正常运行;若超出数组范围,就会导致数据错乱或出现异常值。
修复方法
将lowest初始化为当前轮次的起始索引i,默认当前位置为最小值的索引,同时优化判断逻辑:
int* sortArray(int* array, int size) { for (int i = 0; i < size; i++) { int lowest = i; // 初始化lowest为当前轮次起始索引 for (int k = i; k < size; k++) { // 仅需和当前记录的最小值比较即可 if (array[k] < array[lowest]) { cout << array[k] << " is less than " << array[lowest] << endl; lowest = k; } } int temp = array[lowest]; array[lowest] = array[i]; array[i] = temp; } return array; }
额外优化建议
- 动态分配的数组记得用
delete[] array;释放内存,避免内存泄漏,可在main函数的return前添加该行代码。 main函数通常用return 0;表示程序正常结束,return 1;一般用于标记异常退出。
内容的提问来源于stack exchange,提问作者Aidan
相关产品推荐
相关产品推荐

