C:二维数组的嵌套循环给出了意想不到的结果

标签 c arrays multidimensional-array cs50

这是问题的最小可重现示例。 将高度和长度作为参数(而不是计算它们)是故意的。

typedef struct
{
    int red;
} triple;

int main(void)
{
    triple array[3][3] = {
      { {.red = 10}, {.red = 40}, {.red = 70}},
      { {.red = 110}, {.red = 120}, {.red = 130}},
      { {.red = 200}, {.red = 220}, {.red = 240}}
    };

printarray(2, 2, array);
}


void printarray(int height, int length, triple array[][length])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < length; j++)
        {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}

我得到的输出是:
array[0][0] = 10 处的红色分数
array[0][1] = 40 处的红色分数
array[1][0] = 70 处的红色分数
array[1][1] = 110 处的红色分数

但我希望:
array[0][0] = 10 处的红色分数
array[0][1] = 40 处的红色分数
array[1][0] = 110 处的红色分数
array[1][1] = 120 处的红色分数

二维数组的索引显然没有像我预期的那样工作,但为什么?

最佳答案

您正在将 2,2 传递给 printarray。这是高度,长度

但是,数组是定义的,长度为3。因此,您必须3 作为长度传递给 printarray

否则,printarray 中的索引不正确。如您所见,printarray 中的数组等效于 triple array[2][2]不是 triple array[3 ][3] 根据需要。

height 可以小于定义的高度,但 length 必须 匹配。此处,length步幅。这是给定行中的元素数。

因此,在 main 中,调用:printarray(3,3,array)


如果您真的希望打印数组的一部分,则需要将一个单独的变量传递给 printarray 以实现跨度。

函数必须声明为:

void printarray(int height, int length, int stride, triple array[][stride])

然后,在 main 中,调用它:

printarray(2,2,3,array);

关于C:二维数组的嵌套循环给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61414076/

相关文章:

arrays - 在 R 中的 3 维数组上并行化嵌套 for 循环

c# - 如何在 C# 中从托管 C++ DLL(使用包装类)获取字符串

c - 如何让右列垂直对齐

javascript - 如何从数组列表创建数组对象。 (使用 Angular js)

arrays - 两条记录共享相同的值?

python - 带有 numpy arange 的二维数组

php - 如何从数据库创建 4 维数组

c - 有什么办法可以将 4 字节数表示为 16 字节数吗?

c - C 中的打印数组函数仅打印第一个元素

javascript - 如何按属性对数组进行分组并重新索引结果