Top.Mail.Ru
Ответы

Помогите разобраться в коде C++

задача - Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными
и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами,
которые стоят на нечетных местах).

почему-то у меня цикл не отрабатывает, подскажите пожалуйста из-за чего

По дате
По Рейтингу
Аватар пользователя
Высший разум
1мес
12345678910111213141516171819202122232425262728293031323334353637383940414243
 // 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(); 
} 
Аватар пользователя
Мыслитель
1мес

Не i + 2, а i += 2

Аватар пользователя
Гуру
1мес

🧨 Причина ошибки:
Ошибка в следующем фрагменте кода:

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 = всегда выход за пределы памяти или попытка записи в запрещённую область.

Аватар пользователя
Мастер
1мес

return 0 поставь в конце int main

Аватар пользователя
Мастер
1мес

путон лучшэ