You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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变量,导致其值为内存随机垃圾值,触发未定义行为。

具体问题点

  1. sortArray函数中,int lowest;仅声明变量未赋值,初始值是内存中随机残留的数据。
  2. 内层循环中访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:45:33