如何修复固定原型下有序二维数组二分查找的指针错误?
修正有序二维数组二分查找函数的错误
给定不可修改的函数原型 int findNum(int array[N][M], int num, unsigned int* row, unsigned int* col),原代码存在语法错误和逻辑问题,以下是修正后的完整代码及问题说明:
int findNum(int array[N][M], int num, unsigned int* row, unsigned int* col){ int low = 0, mid, high = N * M - 1; while (low <= high) { mid = (low + high) / 2; // 修正:给指针指向的变量赋值,而非覆盖指针本身 *row = mid / M; *col = mid % M; // 修正:用合法的二维数组索引访问元素 int current_val = array[*row][*col]; if (num < current_val){ high = mid - 1; } else if (num > current_val){ low = mid + 1; } else{ // 找到目标,返回1,调用者可通过row和col获取位置 return 1; } } // 未找到目标 return 0; }
具体修正点:
修复指针赋值错误:
原代码直接把整数赋值给指针变量row和col,这会破坏指针的地址值,完全违背了“通过指针返回结果”的设计。正确做法是用*row和*col解引用指针,把计算出的行/列索引写入指针指向的内存区域,这样调用者才能拿到正确的位置。修复非法指针操作:
原代码*(array + row + col)是C语言不允许的操作——指针之间不能直接相加,而且二维数组的指针语义是array指向第0行的一维数组,必须通过行+列的索引方式访问元素。改用array[*row][*col]是最直观且合法的访问方式,也可以写成(*(array + *row))[*col],效果一致。修正行号计算逻辑:
原代码用mid / N计算行号是逻辑错误,因为每行有M个元素,一维索引mid对应的行号应该是mid / M,列号是mid % M。如果不改这个,当行数N和列数M不同时,查找会完全错位。
内容的提问来源于stack exchange,提问作者user1188938
相关产品推荐
相关产品推荐

