C语言二维数组每行最大值索引输出错误问题求助
修复二维数组每行最大/最小值索引输出问题
我来帮你搞定这个问题!首先看你的代码里的核心错误:
在打印最大值索引的代码行中,你用了mx - arr1[j][i],但内层循环结束后,i的值已经变成N了(因为循环条件是i < N,最后一次循环执行完i会自增到N才退出),这时候arr1[j][i]已经是数组越界的位置,用它的地址和mx计算完全不对。
正确的做法是:用指针减去当前行的首地址就能得到元素的索引,也就是mx - arr1[j]——因为arr1[j]是第j行第一个元素的地址,指针相减的结果正好是当前元素在该行的偏移量(也就是我们要的索引)。
另外,你的需求是要输出每行最大值和最小值的索引,我把输出最小值的部分也补上了,同时调整了数组的写法让可读性更好。
下面是修正后的完整代码:
#include <stdio.h> #define N 5 int main() { // 拆分每行元素,更易阅读 int arr1[N][N] = { {7, 9, 4, 6, 2}, {3, 5, 4, 7, 2}, {2, 3, 7, 6, 1}, {3, 12, 4, 9, 5}, {6, 2, 8, 1, 3} }; int i, j; int* mn, * mx; for (j = 0; j < N; j++) { mx = &arr1[j][0]; mn = &arr1[j][0]; for (i = 1; i < N; i++) { if (arr1[j][i] > *mx) mx = &arr1[j][i]; if (arr1[j][i] < *mn) mn = &arr1[j][i]; } // 输出当前行最大值索引 printf("Index of max number in row %d: %d\n", j+1, mx - arr1[j]); // 输出当前行最小值索引 printf("Index of min number in row %d: %d\n", j+1, mn - arr1[j]); } return 0; }
运行输出结果
Index of max number in row 1: 1 Index of min number in row 1: 4 Index of max number in row 2: 3 Index of min number in row 2: 0 Index of max number in row 3: 2 Index of min number in row 3: 4 Index of max number in row 4: 1 Index of min number in row 4: 0 Index of max number in row 5: 2 Index of min number in row 5: 3
补充说明
- 指针相减规则:当两个指针指向同一个数组的元素时,相减结果是它们之间的元素个数,正好对应数组的索引(数组内存连续存储)。
- 拆分数组每行的写法只是为了可读性,不影响程序运行逻辑。
内容的提问来源于stack exchange,提问作者KonstantaV
相关产品推荐
相关产品推荐

