【问题标题】:Incorrect results when printing out a submatrix of a 2D array in C在 C 中打印出二维数组的子矩阵时结果不正确
【发布时间】:2020-04-11 21:24:20
【问题描述】:

我是 C 新手,正在学习数组。我创建了一个函数print2d,用于打印出一个二维数组。我创建了一个 9x9 数组,array2d。首先,我使用print2d 打印出array2d,效果很好。然后,我尝试打印出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 列的二维数组(int array[][3]),而不是一个9x9 数组。我不确定导致了什么样的问题,以及为什么输出的第一行是正确的,但第三行不正确。感谢您的帮助!

【问题讨论】:

  • 您将二维数组传递给函数,但print2d(3,3,array2d) 在数组中的列数上撒谎。有9 而不是3。请区分可用的列数和使用的列数。 C 编译器必须知道实际的列数,才能正确索引数组。
  • .... 所以该函数可能还需要 四个 参数:子矩阵尺寸及其角位置。
  • 如果我通过 C 编译器错误的列数,会发生什么?是否存在某种段错误?
  • @monkey king 二维数组将作为一维数组存储在内存中,第一行的所有元素然后第二行,依此类推。所以如果你谎报数组的大小,你想得到的索引是不准确的
  • 如果数组 3x2: {{1,2},{3,4},{5,6}} 在内存中,元素的存储方式如下:1 2 3 4 5 6。所以如果你说编译器认为这是一个 2x2 数组,因此某些值的顺序发生了变化。结果,第一行是准确的,因为您打印的第一行的顺序没有改变。但是第二行和第三行是不同的。

标签: c multidimensional-array


【解决方案1】:

你可以使用双指针代替二维数组

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 2021-11-20
    • 2011-07-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多