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

排查C语言代码触发Segmentation fault (core dumped)的错误原因

问题根源

段错误由未初始化的野指针直接导致:

  • 你定义了float *start_population、float *end_population两个指针变量,但没有给它们赋值合法的内存地址,指针内部存储的是随机垃圾值,指向的是你没有读写权限的内存区域
  • 调用scanf("%f", start_population)时,scanf会直接往这个随机地址写入用户输入的浮点数,触发内存越界访问,直接导致段错误
修复方案

方案1(常规场景更合理,不需要额外用指针)

直接定义普通float变量存储数值,scanf时传入变量的地址即可,这是这类输入场景的标准写法:

#include <stdio.h>

float yearly_llamas(float starting_population) {
    // 返回年末羊驼总数
    float born = starting_population / 3;
    float died = starting_population / 4;
    float end_of_year_pop = starting_population + born - died;

    return end_of_year_pop;
}

int main(void) {
    
    // 直接定义普通变量存储数值即可,不需要指针
    float start_population;
    float end_population;

    // 起始种群最小阈值
    int start_min = 9;

    
    // 校验起始种群输入不小于9
    do {
        printf("Starting population: ");
        // 传入变量的地址给scanf
        scanf("%f", &start_population);
    } while (start_population < start_min);
    
 

    // 输入目标种群,校验不小于起始种群
    do {
        printf("Ending population: ");
        scanf("%f", &end_population);
    } while (end_population < start_population);

    // 校验打印
    printf("%f\n", start_population);
    printf("%f\n", end_population);

    float end_pop = yearly_llamas(start_population);

    printf("Llamas at the end of the year: %f\n", end_pop);


  return 0;
}

方案2(练习指针用法可选)

如果是为了练习指针操作,可以先给指针分配合法的内存地址后再使用:

  1. 让指针指向已有的普通变量:
float start, end;
float *start_population = &start;
float *end_population = &end;
// 后续指针读写逻辑和你原来的写法保持一致即可
  1. 动态申请堆内存,使用完后记得释放避免内存泄漏:
float *start_population = malloc(sizeof(float));
float *end_population = malloc(sizeof(float));
// 后续使用逻辑不变
// 程序结束前释放内存
free(start_population);
free(end_population);
可选优化建议

羊驼的数量始终是整数,不存在小数个个体,你可以把所有float类型替换为int类型,计算逻辑更贴合实际场景,也不会出现浮点数精度误差问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:00