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

