You need to enable JavaScript to run this app. C语言独立函数实现浮点数组冒泡排序,返回数组打印为0.0000问题求助
优惠活动
大模型
产品
解决方案
定价
更多

C语言独立函数实现浮点数组冒泡排序,返回数组打印为0.0000问题求助

浮点数组冒泡排序输出异常的定位与修正
  • 冒泡排序函数本身逻辑无问题
    函数通过传入的数组首地址在原内存空间完成元素交换,执行完成后返回同地址的指针,赋值给testSorted的流程符合C语言值传递/地址传递的规则,不需要修改排序逻辑。
  • 核心报错点:printf调用不符合语法规范
    原代码写的printf(testSorted);存在本质错误:printf的第一个入参必须是携带格式占位符的字符串常量,而testSorted是指向浮点数组的指针类型,传入后会被函数误将指针指向的内存内容当作格式解析规则,属于未定义行为,最终输出0.0000就是这类错误的典型表现。
    打印排序后内容的正确方式:如果要输出单个元素,需要搭配格式符,例如打印数组第一个元素的写法为printf("%.2f", testSorted[0]);;如果要遍历输出全部排序结果,需要通过循环逐元素打印,不能直接将数组指针传入printf。
  • 附带的编译隐患
    1. 代码定义数组时使用float test[SIZE] = {...},但全文未通过#define定义SIZE宏,部分编译器会将未定义的SIZE隐式赋值为0,导致数组初始化内存异常。
    2. 原代码使用void main()的写法不符合C语言标准,标准要求main函数返回值类型为int,非标准写法在部分编译环境下会引发栈内存布局异常,间接导致输出错误。

修正后可正常运行的参考代码:

#include <stdio.h>
#define SIZE 40

float * bubbleSort(float statsArray[], int n){
    float swap;
    for (int a = 0;  a < n-1; a++)
    {
        for (int b = 0; b < n - a - 1; b++)
        {
            if (statsArray[b] < statsArray[b+1])
            {
                swap  = statsArray[b];
                statsArray[b] = statsArray[b+1];
                statsArray[b+1] = swap;
            }
        }
    }
    return statsArray;
}

int main() {
    float test[SIZE] = { 34, 201, 190, 154,   8, 194,   2,   6,
                         114, 88,   45,  76, 123,  87,  25,  23,
                         200, 122, 150, 90,   92,  87, 177, 244,
                         201,   6,  12,  60,   8,   2,   5,  67,
                         7,  87, 250, 230,  99,   3, 100,  90};
    float * testSorted;
    int p = 40;

    testSorted =  bubbleSort(test, p);
    // 逐元素打印排序后的降序数组
    for(int i = 0; i < p; i++){
        printf("%.2f ", testSorted[i]);
    }
    printf("\n");

    return 0;
}

内容的提问来源于stack exchange,提问作者VLSI_EE_01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 07:24:02