Почему это генерирует бесконечный цикл (C, While Loop)

Я делаю программу для своего класса, и мне нужно установить все значения массива «десятилетие» в -1, прежде чем я начну. Я попробовал это (и версию в цикле for), и это просто помещает меня в бесконечный цикл! Может кто-нибудь объяснить, почему это происходит, и как я могу это исправить?

Код:

int decade[9][9], i = 0, k = 0;
while (i<10) {
    while (k<10) {
        printf("i is %d, k is %d\n",i,k);
        decade[i][k] = -1;
        k++;
    }
    k=0;
    i++;
}

Заранее спасибо!

Он выводит это: Что выводит

Для тех, кому в будущем понадобится ответ, объявите десятилетие как "десятилетие[10][10]" вместо "десятилетие[9][9]" или укажите другое определение.


person Beaurocks16    schedule 06.04.2013    source источник
comment
начальное значение для i и k?   -  person gongzhitaao    schedule 07.04.2013
comment
Что он печатает?   -  person Explosion Pills    schedule 07.04.2013
comment
Извините, я не включил часть, где i и k оба объявлены как «0», вставив это...   -  person Beaurocks16    schedule 07.04.2013
comment
Как объявляется decade? Как вы его инициализируете?   -  person Some programmer dude    schedule 07.04.2013
comment
@JoachimPileborg Обновить страницу, просто вставил это туда   -  person Beaurocks16    schedule 07.04.2013
comment
Компиляция и запуск этого кода на моей машине не приводит к бесконечному циклу. Нам нужно увидеть реальный код.   -  person jwodder    schedule 07.04.2013
comment
0 -> 9 — это 10 элементов, поэтому [9][9] недостаточно места   -  person Keith Nicholas    schedule 07.04.2013
comment
Я добавил изображение того, что он распечатывает.   -  person Beaurocks16    schedule 07.04.2013
comment
@ Beaurocks16: Но массив, объявленный с помощью [9], будет иметь только 9 элементов с индексами от 0 до 8.   -  person jwodder    schedule 07.04.2013
comment
@jwodder Только что понял, удалил эту часть комментария   -  person Beaurocks16    schedule 07.04.2013


Ответы (6)


Когда вы объявляете массив размером 9, он имеет индексы от 0 до 8. Вы переходите к 9, который перезапишет память. Это неопределенное поведение, которое может привести к множеству скрытых, но ошибочных действий.

person Some programmer dude    schedule 06.04.2013

Я не знаю, как определяется "десятилетие", но если оно определено неправильно и/или имеет неправильный размер, вы можете получить переполнение буфера, что может привести к неправильная память устанавливается на «-1» - т.е. переменные «i» или «k» могут быть перезаписаны.

person Brad    schedule 06.04.2013
comment
Похоже, вы описываете переполнение буфера, а не утечку памяти. - person Pubby; 07.04.2013
comment
Переполнение буфера — это тип утечки памяти, но это не обязательно переполнение. Он может быть неправильным в одном измерении, он может иметь неправильное количество измерений, он может быть неправильного типа и т. д. - person Brad; 07.04.2013
comment
@Brad Нет, утечка памяти - это нечто совершенно другое. - person ; 07.04.2013

int decade[9][9], i = 0, k = 0;
while (i<10) {
    while (k<10) {
        printf("i is %d, k is %d\n",i,k);
        decade[i][k] = -1;
        k++;
    }
    k=0;
    i++;
}

неверно, потому что вы выполняете итерацию от 0 до 9 (10 элементов)

этот код правильный:

int decade[9][9], i = 0, k = 0;
while (i<9) {
   k = 0;

   while (k<9) {
      printf("i is %d, k is %d\n",i,k);
      decade[i][k] = -1;
      k++;
   }

i++;
}

обратите внимание, что вы устанавливаете k равным нулю перед повторным циклом.

Существуют также другие возможности зацикливания, например цикл for, который вы используете, пока циклы на самом деле не для подсчета.

person Quonux    schedule 06.04.2013

Циклы должны быть от 0 до 8 (массив декад имеет длину 9):

while (i<9) {
    while (k<9) {
       /* ... */
    }
}
person Miguel Prz    schedule 06.04.2013

Размер в "9х9" - вы инициализируете 10х10. Установите десятилетие[10][10], используйте (x‹8) или сделайте (x‹=9)

person Brad    schedule 06.04.2013

person    schedule
comment
Не самый быстрый, но и определяет проблему, и приводит пример. - person Beaurocks16; 07.04.2013
comment
Программист без труда поймет, какой КОД я набрал :) - person yunas; 07.04.2013