繁体   English   中英

C:二维数组的嵌套循环给出意外结果

[英]C: Nested loop over 2d array giving unexpected result

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

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

我得到的 output 是:
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 这是height,length

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

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

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

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


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

function 必须声明为:

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

然后,在main中,调用它:

printarray(2,2,3,array);

问题出在您对printarray的调用中:

printarray(2, 2, array);

你告诉 function 该数组有两行两列 - 但它没有,它有三行三列。 编译器假设你没有说谎!

必须使用length参数的正确值调用 function,因为编译器使用它来推断如何计算元素array[i][j]的偏移量。

如果您只想打印该数组的一部分,则应指定要打印的列数和行数作为 function 的额外参数,如下所示:

void printarray(int height, int length, int nrows, int ncols, triple array[][length])
{
    if (nrows > height) nrows = height;
    if (ncols > width) ncols = width;   // Prevent error conditions!
    for (int i = 0; i < nrows; i++) {
        for (int j = 0; j < ncols; j++) {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}

然后像这样调用 function:

    printarray(3, 3, 2, 2, array);

注意:在使用printarray之前,您还缺少function 原型,这在某些编译器上会出错(但在其他编译器上只是警告); main function 之前的某处添加此行:

void printarray(int height, int length, int nrows, int ncols, triple array[][length]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM