在C中打印2D数组的子矩阵时结果不正确

问题描述 投票:0回答:1

我是C语言的新手,正在学习数组。我已经制作了一个函数print2d,以打印出二维数组。我创建了一个9x9数组array2d。首先,我使用array2d打印了print2d,效果很好。然后,我尝试打印出一个array2d的3x3子矩阵,该子矩阵由前三行和前三列中的元素组成。 3x3子矩阵打印错误。

在主要:

int array2d[9][9] = {
        {0, 1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {1, 1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0}
    };
    print2d(rows,cols,array2d);

    print2d(3,3,array2d); // print 3x3 submatrix
void print2d(int rows, int cols, int array[][cols])
{
    printf("{");

    for (int r = 0; r < rows; r++)
    {
        printf("{%i",array[r][0]);
        for (int c = 1; c < cols; c++)
        {
            printf(", %i",array[r][c]);
        }
        printf("}\n");
    }
    printf("}\n");
}

输出:9x9矩阵array2d正确打印出来,但3x3子矩阵打印为:

{{0, 1, 0}
{0, 0, 0}
{0, 0, 0}
}

代替

{{0, 1, 0}
{0, 0, 0}
{1, 1, 0}
}

子矩阵的第一行是正确的,但第三行是不正确的。我的猜测是,通过调用print2d(3,3,array2d),函数print2d期望具有3列的2d数组(int array[][3]),而不是9x9数组。我不确定引起什么问题,为什么输出的第一行是正确的而不是第三行。谢谢您的帮助!

c multidimensional-array
1个回答
0
投票

您可以使用双指针代替2D数组

void print2d(int rows, int cols, int **array);

或将子数组定义为上面的@Weather_Vane注释:

void print2d(int rows, int cols, int array[rows][cols], int sub_row, int sub_col) {
   for (int r = 0; r < sub_row; r++)
    {
       ...
        for (int c = 1; c < sub_col; c++)
        {
          ...
        }
        ...
    }
    printf("}\n");
}

具有子数组参数的数组的主要功能

print2d(9,9,array2d, 9, 9);
print2d(9,9,array2d, 3, 3);

双指针的主要功能:

int main() {
  int rows, cols, i;
  int **array2d;

  /* obtain values for rows & cols*/

  // allocate the array
  array2d = malloc(rows * sizeof(int));
  if (!array2d)
    return -1;
  for (i=0; i<rows; i++) {
    array2d[i] = malloc(cols * sizeof *array2d[i]);
    if(!array2d[i])
        return -1;
  }

  /*init the values of array here */

  print2d(rows,cols,array2d);
  for (i=0; i<rows; i++)
    free(array2d[rows];
  free(array2d);
}
© www.soinside.com 2019 - 2024. All rights reserved.