Локально скомпилированный код c неправильно зацикливается

#c #g

#c #g

Вопрос:

Следующее никогда не завершается в моей системе.

 #include <iostream>

using namespace std;

int main(){
    int solutions[1000][4] = {};
    

    for(int a=0; 3*a<=1000; a  ){
        for(int b=0; 5*b<=1000; b  ){
            for(int c=0; 7*c<=1000; c  ){
                cout << "enter" << "t" << a << "t" << b << "t" << c << endl;
                if (3*a 5*b 7*c > 1000) {break;}
                solutions[3*a 5*b 7*c][0] = a;
                solutions[3*a 5*b 7*c][1] = b;
                solutions[3*a 5*b 7*c][2] = c;
                solutions[3*a 5*b 7*c][3] = 1;
                cout << "exit" << "t" << a << "t" << b << "t" << c << endl << endl;
            }
        }
    }
}
 

Я совершенно в тупике, поэтому решил распечатать журнал изменений переменных. Он выполняет 4 итерации b, а затем, когда c достигает 140, он возвращается к 0. Журнал выглядит так

 ...
enter   0       4       137
exit    0       4       137

enter   0       4       138
exit    0       4       138

enter   0       4       139
exit    0       4       139

enter   0       4       140
exit    0       4       0

enter   0       4       1
exit    0       4       1

enter   0       4       2
exit    0       4       2

enter   0       4       3
exit    0       4       3
...
 

Я скомпилировал это с помощью g B.cpp -o B.exe , а затем просто запустил исполняемый файл. Точный код (с закомментированным протоколированием) завершается должным образом в режиме онлайн на http://cpp.sh /. Моя версия компилятора такова g (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.3.0 . Что здесь может быть не так?

Ответ №1:

Когда a = 0, b = 4, c = 140 , 3*a 5*b 7*c становится 1000 и происходит запись в out-of-bounds solution[1000] . Похоже, что эта запись вне пределов привела к разрыву счетчика циклов.

Выделите еще один элемент, чтобы избежать этой записи за пределы.

     int solutions[1001][4] = {};
 

Комментарии:

1. Да, это было именно так. Означает ли это, что область вне границ, которая была перезаписана, была именно переменной c? Или могли произойти другие вещи в этой неопределенной записи, чтобы вызвать это?

2. @eeegnu Запись вне привязки вызывает неопределенное поведение . Для неопределенного поведения допускается все, что угодно.