C语言程序运行输入数字后出现冻结故障的原因咨询
C代码故障原因及修复方案
程序冻结和int类型变量声明数量完全无关,故障由以下代码错误导致:
- 致命错误(直接导致冻结):
scanf调用未传入变量地址。C语言标准库的scanf要求接收输入的参数必须是变量的内存指针,你当前代码直接传递了未初始化的x1、y1等int变量值,系统会把这些随机垃圾值当成内存地址尝试写入,触发非法内存访问的未定义行为,直接表现就是程序崩溃、冻结。 - 逻辑错误1:距离计算结果用int存储丢失精度。
sqrt、pow返回值均为double浮点类型,直接赋值给int变量会自动截断小数部分,导致计算结果误差极大,建议将sstr1、sstr2、sstr3声明为double类型。 - 逻辑错误2:第三个距离的计算参数错误。你代码中
sstr3的计算复用了xstr1、ystr1参数,得到的还是点1到点2的距离,正确应该使用xstr3、ystr3计算点1到点3的距离。
修复后的完整代码
#include <stdio.h> #include <math.h> int main() { int x1, x2, x3, y1, y2, y3, ystr1, ystr2, ystr3, xstr1, xstr2, xstr3; double sstr1, sstr2, sstr3; printf("请依次输入三个点的x、y坐标,用空格分隔:"); // 变量前加&取地址符 scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3); ystr1 = y2 - y1; xstr1 = x2 - x1; sstr1 = sqrt(pow(xstr1, 2) + pow(ystr1, 2)); ystr2 = y3 - y2; xstr2 = x3 - x2; sstr2 = sqrt(pow(xstr2, 2) + pow(ystr2, 2)); ystr3 = y3 - y1; xstr3 = x3 - x1; // 修正参数,用xstr3和ystr3 sstr3 = sqrt(pow(xstr3, 2) + pow(ystr3, 2)); // 浮点占位符输出,保留2位小数 printf("三点两两距离分别为:%.2lf, %.2lf, %.2lf", sstr1, sstr2, sstr3); return 0; }
内容的提问来源于stack exchange,提问作者haruhisuzumiya
相关产品推荐
相关产品推荐

