2D-массив, выводящий разные значения, если вы распечатываете его по строкам всего массива в C - PullRequest
1 голос
/ 25 мая 2020

Привет, сообщество StackOverflow!

У меня произошла странная вещь в моем C коде.

Вот часть кода, о котором идет речь:

(" tab4 "- это массив длиной 16, 1 размер, заполненный int," tab "- это 2D-массив 4x4, заполненный нулями)

Я пытаюсь поместить значения tab4 в" tab "(каждая строка of «tab» получает 4 цифры tab4)

Я поместил несколько отпечатков для результатов тестирования

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

Это может быть связано с некоторым предупреждением, которое у меня есть:

Код серьезности Описание Состояние подавления строки файла проекта Предупреждение C6386 Переполнение буфера при записи на «вкладку [1]»: доступный для записи размер составляет «16» байтов, но может быть записано «20» байтов.

Код серьезности Описание Состояние подавления строки файла проекта Предупреждение C6385 Чтение недопустимых данных из 'tab [1]': читаемый размер i s '16' байт, но можно прочитать '20' байтов.

(такое же предупреждение для всех циклов «for»)

Я знаю, это означает, что я пытаюсь писать куда-то, чего не должен, но я не знаю, как я мог бы сделать это

Спасибо за ответы!

1 Ответ

3 голосов
/ 25 мая 2020

Циклы такие, что

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

    }

неверны. Вторая «строка» (одномерный массив) массива tab имеет диапазон допустимых индексов [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");
}
...