如果按 C 中整个数组的行打印二维数组,则输出不同的值

2D array outputing different values if you print it by line of the entire array in C

嘿 Whosebug 社区!

我的 C 代码中发生了一件奇怪的事情。

这里是相关代码部分:

( "tab4" 是一个 16 长的 1 维数组,用整数填充,"tab" 是一个用 0 填充的 4x4 二维数组)

我正在尝试将 tab4 的值放入 "tab"("tab" 的每一行得到 tab4 的 4 位数字)

我打印了一些来测试结果

for (int u = 0; u < 4; u++)
        {
            tab[0][u] = tab4[u];
            printf(" %d ", tab[0][u]);
        }
        printf("\n");
        for (int yu = 4; yu < 8; yu++)
        {
            tab[1][yu] = tab4[yu];
            printf(" %d ", tab[1][yu]);

        }
        printf("\n");
        for (int cont = 8; cont < 12; cont++)
        {
            tab[2][cont] = tab4[cont];
            printf(" %d ", tab[2][cont]);
        }
        printf("\n");
        for (int ye = 12; ye < 16; ye++)
        {
            tab[3][ye] = tab4[ye];
            printf(" %d ", tab[3][ye]);
        }
        printf("\n\n");

        for (int i = 0; i < 4; i++)
        {
            printf("\n");
            for (int y = 0; y < 4; y++)
            {
                printf(" %d ", tab[i][y]);
            }
        }
        printf("\n\n");

这里发生的奇怪事情是,当我逐行打印 "tab" 时,它可以工作,但是当我将它作为一个整体打印时,它却没有。

这是我的输出:

This is the array, printed line by line
 16  8  4  0
 8  64  0  0
 0  0  0  0
 0  0  0  0

here is the array printed as a whole

 16  8  4  0
 0  0  0  0
 8  64  0  0
 0  0  0  0

这可能与我收到的一些警告有关:

Severity Code Description Project File Line Suppression State Warning C6386 Buffer overrun while writing to 'tab[1]': the writable size is '16' bytes, but '20' bytes might be written.

Severity Code Description Project File Line Suppression State Warning C6385 Reading invalid data from 'tab[1]': the readable size is '16' bytes, but '20' bytes may be read.

(所有 "for" 循环的警告相同)

我知道这意味着我正在尝试写一些我不应该写的地方,但我不知道我怎么可能那样做

感谢您的回答!

循环使得

    for (int yu = 4; yu < 8; yu++)
    {
        tab[1][yu] = tab4[yu];
        printf(" %d ", tab[1][yu]);

    }

不正确。数组 tab 的第二个 "row" (一维数组)具有有效索引范围 [0, 4].

所以你至少需要重写

    for (int yu = 4; yu < 8; yu++)
    {
        tab[1][yu-4] = tab4[yu];
        printf(" %d ", tab[1][yu-4]);

    } 

或者您可以使用以下循环填充数组选项卡

for ( int i = 0, k = 0; i < 4; i++)
{
    for ( int j = 0; j < 4; j++ )
    {
        tab[i][j] = tab4[k++];
        printf(" %d ", tab[i][j]);
    }
    printf("\n");
}

for ( int i = 0; i < 4; i++)
{
    for ( int j = 0; j < 4; j++ )
    {
        tab[i][j] = tab4[4 * i + j];
        printf(" %d ", tab[i][j]);
    }
    printf("\n");
}