簡體   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