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

C语言中如何向函数传递二维数组?代码问题分析与修复

你的C语言二维数组查找问题分析与修复方案

核心问题梳理

1. 二维数组传递语法错误

C语言规定,向函数传递二维数组时必须显式指定第二维的大小——编译器需要这个信息计算数组元素的内存偏移量。你代码里的int arasrc(double a[][], int r, int c, double s);及函数定义中的double a[][]属于非法语法,编译器无法识别数组内存布局。

2. 查找函数逻辑完全错误

当前查找函数在第一次循环时,只要第一个元素不等于目标值就直接return 0,根本不会遍历后续元素。这会导致只有数组第一个元素匹配时才返回“找到”,其余情况直接判定“未找到”,完全不符合需求。

3. 查找结果位置输出错误

主函数中打印位置时使用的r和c是之前打印数组循环结束后的变量值(此时r=3,c=3),并非找到目标元素的真实位置,会输出错误坐标。

4. 非标准头文件依赖

<conio.h>是DOS时代的非标准头文件,现代编译器(如GCC、Clang)大多不支持,getch()函数会导致编译失败。


修复后的完整代码

#include <stdio.h>

// 修改数组参数为指定第二维大小,添加指针参数传递找到的行和列
int arasrc(double a[][3], int rows, int cols, double target, int *found_row, int *found_col);

int main()
{
    double ara[3][3];
    int r, c;
    
    // 输入数组元素
    for(r = 0; r < 3; r++)
    {
        for(c = 0; c < 3; c++)
        {
            printf("\n\tEnter value for array (%d, %d): ", r + 1, c + 1);
            scanf("%lf", &ara[r][c]);
        }
    }
    
    // 打印数组
    printf("\n\tArray = ");
    for(r = 0; r < 3; r++)
    {
        printf("\n\t\t");
        for(c = 0; c < 3; c++)
        {
            printf("[ %6.2lf ]", ara[r][c]);
        }
    }
    
    // 执行查找
    double search_val;
    int found, row, col;

    printf("\n\tEnter a value to search: ");
    scanf("%lf", &search_val);
    found = arasrc(ara, 3, 3, search_val, &row, &col);
    
    if(found)
    {
        printf("\n\tFound at position (%d, %d).", row + 1, col + 1);
    }
    else
    {
        printf("\n\tNot found!");
    }

    // 替换getch()为标准C的getchar(),等待用户输入后退出
    getchar();
    getchar(); // 吸收之前scanf留下的换行符
    return 0;
}

// 修复后的查找函数
int arasrc(double a[][3], int rows, int cols, double target, int *found_row, int *found_col)
{
    for(int r = 0; r < rows; r++)
    {
        for(int c = 0; c < cols; c++)
        {
            // 浮点数比较用误差范围,避免精度问题
            if((target - a[r][c] < 1e-6) && (a[r][c] - target < 1e-6))
            {
                *found_row = r;
                *found_col = c;
                return 1; // 找到则返回1,并记录位置
            }
        }
    }
    return 0; // 遍历完所有元素未找到,返回0
}

关键修复说明

  • 二维数组传递修正:将函数参数改为double a[][3],明确第二维大小为3,让编译器能正确计算数组元素的内存地址。若需要支持任意列数的二维数组,可改用指针形式double (*a)[cols](需C99及以上标准支持)。
  • 查找逻辑修正:移除错误的提前return 0,只有遍历到匹配元素时才返回1,遍历结束后未找到则返回0。同时添加浮点数安全比较(用1e-6作为误差范围),避免因浮点数精度问题导致匹配失败。
  • 位置传递修正:通过指针参数int *found_row和int *found_col将找到的元素位置传递回主函数,确保输出正确坐标。
  • 移除非标准依赖:替换getch()为标准的getchar(),保证代码在现代编译器下正常编译运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:50:22