改用while循环后C语言浮点数排序函数出现段错误的原因?
浮点数数组排序时出现段错误的问题修复
你的代码出现段错误和排序失效的核心问题有两个:
- 交换变量类型不匹配:用
char support_var存储float值,char仅占1字节,而float通常占4字节,赋值时会截断数据,写回数组时破坏内存结构,直接引发段错误。 - 排序循环中
z未重置:外层循环每次迭代时,z没有重新初始化为size_array-1,第一次循环后z变为0,后续外层循环无法进入内层排序逻辑,甚至会出现数组越界访问(当z减至负数时)。
修正后的代码
#include <stdio.h> int main(void) { float three_numbers[3]; float support_var; // 改为float类型,匹配浮点数存储需求 int size_array; int i; int z; size_array = 3; i = 0; while (i < size_array) { printf("Please, input one non-integer values: "); scanf("%f", &three_numbers[i]); i++; } i = 0; while (i < size_array) { z = size_array - 1; // 每次外层循环重置z的初始位置 while (z > i) // 优化条件,避免自身比较 { if (three_numbers[i] < three_numbers[z]) { support_var = three_numbers[i]; three_numbers[i] = three_numbers[z]; three_numbers[z] = support_var; } z--; } i++; } i = 0; while (i < size_array) { printf("The %dth place is %.1f. \n", i + 1, three_numbers[i]); i++; } return (0); }
关键修正说明
- 类型匹配:将临时交换变量改为
float类型,确保能完整存储浮点数,避免内存溢出和数据损坏。 - 循环变量重置:每次外层循环开始时重新初始化
z,保证内层循环能从数组末尾开始进行比较排序。 - 条件优化:内层循环条件改为
z > i,减少一次无意义的自身比较,提升效率。
运行修正后的代码,输入示例数值后会正常输出排序结果,不再出现段错误。
内容的提问来源于stack exchange,提问作者moxú
相关产品推荐
相关产品推荐

