排查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(练习指针用法可选)
如果是为了练习指针操作,可以先给指针分配合法的内存地址后再使用:
- 让指针指向已有的普通变量:
float start, end; float *start_population = &start; float *end_population = &end; // 后续指针读写逻辑和你原来的写法保持一致即可
- 动态申请堆内存,使用完后记得释放避免内存泄漏:
float *start_population = malloc(sizeof(float)); float *end_population = malloc(sizeof(float)); // 后续使用逻辑不变 // 程序结束前释放内存 free(start_population); free(end_population);
可选优化建议
羊驼的数量始终是整数,不存在小数个个体,你可以把所有float类型替换为int类型,计算逻辑更贴合实际场景,也不会出现浮点数精度误差问题。
内容的提问来源于stack exchange,提问作者madmonkey
相关产品推荐
相关产品推荐

