Почему я получаю ошибку 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 шт):

Автор решения: Harry

Забавно.

Вы объявляете вектора с 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";
}
→ Ссылка
Автор решения: Innsmouth fisherman

Вопрос закрыт, работающий код выглядит так:

#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;
}
→ Ссылка