#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 Запись вне привязки вызывает неопределенное поведение . Для неопределенного поведения допускается все, что угодно.