Помогите разобраться в коде C++
задача - Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными
и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами,
которые стоят на нечетных местах).
почему-то у меня цикл не отрабатывает, подскажите пожалуйста из-за чего
// C++20
#include <array>
#include <iostream>
#include <random>
#include <span>
constexpr size_t length = 20;
using namespace std;
using int_t = int;
using array_t = array<int_t, length>;
void show(const span<int_t>& sequence) {
for (auto value : sequence) cout << value << ' ';
cout.put('\n');
}
void fill_random(array_t& sequence, int_t a, int_t b) {
if (b < a) swap(a, b);
uniform_int_distribution uid(a, b);
mt19937 gen{ random_device()() };
for (auto& value : sequence) value = uid(gen);
}
void exchange_of_neighbors(array_t& sequence) {
auto p_left = to_address(sequence.begin());
auto p_right = to_address(next(sequence.begin()));
const auto p_end = to_address(sequence.end());
while (p_right < p_end) {
iter_swap(p_left, p_right);
p_left += 2;
p_right += 2;
}
}
int main() {
array_t sequence{};
fill_random(sequence, 10, 99);
show(sequence);
exchange_of_neighbors(sequence);
show(sequence);
cin.get();
}
Не i + 2, а i += 2
🧨 Причина ошибки:
Ошибка в следующем фрагменте кода:
int* ptchet = &arr[0], *ptnechet = &arr[1];
for (int i = 0; i < 20; i += 2) {
temp = *ptchet;
*ptchet = *ptnechet;
*ptnechet = temp;
ptchet += 2;
ptnechet += 2;
}
Ты используешь два указателя и сдвигаешь их на +=2 на каждой итерации. Но ptnechet указывает на arr[1], а дальше сдвигается вперёд, и в последний проход (i=18) оба указателя будут указывать на:
ptchet → arr[18] ✅ (нормально)
ptnechet → arr[19] ✅ (тоже окей)
НО после выполнения ptchet += 2 и ptnechet += 2, они станут:
ptchet → arr[20] ❌ выход за пределы массива!
ptnechet → arr[21] ❌ ещё хуже
А в следующей итерации (i = 20), ты снова заходишь в цикл, но arr[20] не существует (у тебя int arr[20];, индексы — от 0 до 19), и ты получаешь ошибку доступа к памяти — вот она и есть.
📌 Вывод:
У тебя всё правильно с логикой, просто последняя итерация заходит за границу массива.
Исправь условие цикла или добавь if, и всё будет работать.
Ошибка 0xC0000005 = всегда выход за пределы памяти или попытка записи в запрещённую область.
return 0 поставь в конце int main
путон лучшэ