You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复固定原型下有序二维数组二分查找的指针错误?

修正有序二维数组二分查找函数的错误

给定不可修改的函数原型 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;
}

具体修正点:

  1. 修复指针赋值错误:
    原代码直接把整数赋值给指针变量row和col,这会破坏指针的地址值,完全违背了“通过指针返回结果”的设计。正确做法是用*row和*col解引用指针,把计算出的行/列索引写入指针指向的内存区域,这样调用者才能拿到正确的位置。

  2. 修复非法指针操作:
    原代码*(array + row + col)是C语言不允许的操作——指针之间不能直接相加,而且二维数组的指针语义是array指向第0行的一维数组,必须通过行+列的索引方式访问元素。改用array[*row][*col]是最直观且合法的访问方式,也可以写成(*(array + *row))[*col],效果一致。

  3. 修正行号计算逻辑:
    原代码用mid / N计算行号是逻辑错误,因为每行有M个元素,一维索引mid对应的行号应该是mid / M,列号是mid % M。如果不改这个,当行数N和列数M不同时,查找会完全错位。

内容的提问来源于stack exchange,提问作者user1188938

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:27