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
相关产品推荐
相关产品推荐

