中点ADT开发求助:mid_point函数调用运行异常排查
解决Point中点函数
mid_point的实现问题 我来帮你搞定这个mid_point函数的问题,先看看你当前代码的问题和正确的实现方式:
当前代码的明显问题
你写的mid_point开头Point * mid_point(Point *x, Point *y) { int m…存在两个核心问题:
- 用
int类型处理中点坐标,会直接丢失浮点数精度(毕竟输入的是double类型的坐标) - 没有完成内存分配和正确的返回逻辑,大概率会导致悬空指针或者内存访问错误
正确的mid_point实现思路
要实现这个函数,你需要遵循这几个步骤:
- 用
x_of和y_of函数获取两个输入点的坐标值 - 计算中点的x、y值:分别取两个点对应坐标的平均值(必须用
double类型计算) - 调用
make_point创建新的Point实例(这个函数负责分配内存并初始化Point对象,避免悬空指针问题) - 返回新创建的Point指针
完整的实现代码
Point * mid_point(Point *p1, Point *p2) { // 获取两个输入点的坐标 double x1 = x_of(p1); double y1 = y_of(p1); double x2 = x_of(p2); double y2 = y_of(p2); // 计算中点坐标(用2.0保证浮点数除法) double mid_x = (x1 + x2) / 2.0; double mid_y = (y1 + y2) / 2.0; // 创建并返回新的Point实例 return make_point(mid_x, mid_y); }
关键细节说明
- 为什么必须用
make_point?因为它应该是负责在堆上分配Point内存的函数,如果直接返回栈上的局部Point变量,会导致悬空指针,调用方使用时会触发未定义行为。 - 计算时用
2.0而非2:如果用整数2,当两个浮点数相加后除以2会触发整数除法,丢失小数部分(比如(1.5+3.5)/2用整数除法会得到2,而非正确的2.5)。 - 参数命名优化:把参数从
x、y改成p1、p2,避免和坐标变量混淆,提高代码可读性。
现在你再调用mid_point(make_point(1.0, 1.0), make_point(3.0, 3.0)),应该会正确返回坐标为(2.0, 2.0)的Point实例,用print_point就能看到正确结果啦。
内容的提问来源于stack exchange,提问作者jw lee




