C语言传入三个double指针存储三角形边长,输入后程序崩溃如何解决?
崩溃原因
- 最直接的触发点是空指针解引用:你代码中的
if (side1 == 0)是判断指针本身是否为空,当该条件成立时,side1是空指针,此时执行*side1 = value会直接操作非法内存,导致程序崩溃。 - 逻辑存在偏差:你原本的需求是判断
side1指向的double变量是否还未赋值(初始值为0),正确的判断条件应该是*side1 == 0,而非判断指针本身的值。 - 调用方式错误也可能触发该问题:如果在调用该函数时,你传入的是未初始化的野指针,没有让指针指向有效的double类型变量,解引用操作同样会触发崩溃。
- 额外隐患:
fgets返回NULL时你没有做任何容错处理,直接使用input缓冲区的内容,极端情况下也会引发异常。
修复方案
- 修正赋值判断逻辑,将指针本身的判断改为对指针指向值的判断:
// 修正side1、side2、side3的判断条件 if (*side1 == 0) { *side1 = value; } else if (*side2 == 0) { *side2 = value; } else if (*side3 == 0) { *side3 = value; }
- 保证调用侧传入的指针指向有效内存:
调用该函数前需要先声明普通double变量,初始化值为0后,将变量的地址传入函数,示例:
// 调用侧示例代码 double s1 = 0, s2 = 0, s3 = 0; // 传入变量地址,而非未初始化的指针 input_triangle_sides(&s1, &s2, &s3);
- 补充
fgets异常处理逻辑,避免读取失败后访问无效数据:
if (fgets(input, sizeof(input), stdin) == NULL) { printf("输入读取失败,请重试\n"); // 此处根据你的业务逻辑做返回或者重试处理 return; }
内容的提问来源于stack exchange,提问作者Molly
相关产品推荐
相关产品推荐

