C语言使用指针与函数求二维数组每列最大值代码错误排查
代码问题定位与修正
核心错误点
- 遍历逻辑错误:C语言二维数组采用行优先存储,你当前代码中ptr每次自增1,内层循环遍历完一整行元素才结束,实际计算的是每行的最大值,和需求的每列最大值完全不符。按列遍历时,同一列相邻元素的地址间隔为总列数k,对应第j列第i行的元素地址为
ptr + j + i*k。 - 最大值初始值错误:你将最大值变量y初始化为0,当矩阵存在负数元素时,计算结果会完全错误,正确做法是将y初始化为当前列的第一个元素值。
修正后代码
#include <stdio.h> void MAX(int *ptr, int b, int k) { int i, j, y; for (j = 0; j < k; j++) { // 初始化最大值为当前列第一个元素 y = *(ptr + j); for (i = 1; i < b; i++) { // 按列取元素:每次跳过k个位置(一整行) int *curr_ptr = ptr + j + i * k; if (y < *curr_ptr) { y = *curr_ptr; } } printf("%d ", y); } } int main() { int b, k; scanf("%d %d", &b, &k); int arr[b][k]; for (int i = 0; i < b; i++) { for (int j = 0; j < k; j++) { scanf("%d", &arr[i][j]); } } MAX(&arr[0][0], b, k); return 0; }
验证说明
用你给出的输入示例测试,修正后代码会依次遍历每一列:
- 第1列元素为1、8、1、9,最大值9
- 第2列元素为3、4、2、8,最大值8
- 第3列元素为2、3、3、7,最大值7
- 第4列元素为1、2、4、6,最大值6
最终输出9 8 7 6,符合预期结果。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

