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

改用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);
}

关键修正说明

  1. 类型匹配:将临时交换变量改为float类型,确保能完整存储浮点数,避免内存溢出和数据损坏。
  2. 循环变量重置:每次外层循环开始时重新初始化z,保证内层循环能从数组末尾开始进行比较排序。
  3. 条件优化:内层循环条件改为z > i,减少一次无意义的自身比较,提升效率。

运行修正后的代码,输入示例数值后会正常输出排序结果,不再出现段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:51:20