【发布时间】: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 数组,因此某些值的顺序发生了变化。结果,第一行是准确的,因为您打印的第一行的顺序没有改变。但是第二行和第三行是不同的。