Почему я получаю ошибку Invalid Pointer и мусор в результатах?
Я выполняю простенькое задание вот тут: https://stepik.org/lesson/13025/step/15?auth=login&unit=4377
Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. Вам дана расстановка 8 ферзей на доске, определите, есть ли среди них пара бьющих друг друга.
Мой код:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main() {
bool in_danger = false;
vector <int> x(8), y(8);
for (int i = 0; i < 16; i++) {
if (i % 2 == 0) {
cin >> x[i];
}
else {
cin >> y[i];
}
}
for(int i = 0; i < 8; i+=2){
if((x[i] == x[i+1] || y[i+1] == y[i+1]) || (abs(x[i] - y[i]) == abs(x[i+1] - y[i+1]))){
in_danger = true;
}
}
if(in_danger){
cout << "YES";
}else{
cout << "NO";
}
return 0;
}
И его выполнение вызывает ошибку:
*** Error in `./main': munmap_chunk(): invalid pointer: 0x0000000002537860 ***
======= Backtrace: =========
[0x4ad787]
[0x4b3012]
[0x4006c6]
[0x496743]
[0x496b02]
[0x400eea]
======= Memory map: ========
00400000-00583000 r-xp 00000000 fe:01 525472 /sandbox/main
00782000-0078b000 rw-p 00182000 fe:01 525472 /sandbox/main
0078b000-00790000 rw-p 00000000 00:00 0
02523000-02562000 rw-p 00000000 00:00 0 [heap]
7f1f90573000-7f1f90574000 rw-p 00000000 00:00 0
7ffd2c44a000-7ffd2c46b000 rw-p 00000000 00:00 0 [stack]
7ffd2c548000-7ffd2c54b000 r--p 00000000 00:00 0 [vvar]
7ffd2c54b000-7ffd2c54d000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
Я попытался проверить, что записано в массивах:
for (int i = 0; i < 16; i++) {
cout << x[i] << " " << y[i];
}
И получил следующее: 1 00 72 00 43 00 24 00 8, хотя сам вводил: 1 7 2 4 3 2 4 8
Почему так?
Ответы (2 шт):
Забавно.
Вы объявляете вектора с 8 элементами:
vector <int> x(8), y(8);
После чего ничтоже сумняшеся работаете с 16 (!) элементами:
for (int i = 0; i < 16; i++) {
if (i % 2 == 0) {
cin >> x[i];
}
else {
cin >> y[i];
}
Потом - скромно выходите за границы только на 1 элемент (да, вы можете возразить, что i у вас только 6 и не более, но все равно - так писать не надо...)
for(int i = 0; i < 8; i+=2){
if((x[i] == x[i+1] ....
Все, undefined behavior. Увы. У вас, к счастью, приводящее к немедленному краху программы.
Update
Для тех, кто в танке - сдавайте...
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
vector <int> x(8), y(8);
for (int i = 0; i < 8; i++)
cin >> x[i] >> y[i];
for(int i = 0; i < 7; ++i)
for(int j = i+1; j < 8; ++j)
{
if (x[i] == x[j] || y[i] == y[j] ||
abs(x[i]-x[j]) == abs(y[i]-y[j]))
{
cout << "YES"; return 0;
}
}
cout << "NO";
}
Вопрос закрыт, работающий код выглядит так:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main() {
bool in_danger = false, horizontal, diagonal;
vector <int> x(8), y(8);
for (int i = 0; i < 8; i++) {
cin >> x[i];
cin >> y[i];
}
for (int i = 0; i < 8; i++) {
for(int j = i+1; j < 8; j++){
horizontal = (x[i] == x[j]) || (y[i] == y[j]);
diagonal = abs(x[i] - x[j]) == abs(y[i] - y[j]);
if (horizontal || diagonal) {
in_danger = true;
}
}
}
if (in_danger) {
cout << "YES";
}
else {
cout << "NO";
}
return 0;
}