Помогите разобраться в коде c++ - Вопросы по С+

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

Регистрация
31 Окт 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
задача - Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными

и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами,

которые стоят на нечетных местах).



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

317615934_b77b9c1c0a344c5e037fd9788044fe42_240x240.png

 
Регистрация
4 Окт 2013
Сообщения
92
Репутация
0
Спасибо
0
Монет
0
? Причина ошибки:
Ошибка в следующем фрагменте кода:

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), и ты получаешь ошибку доступа к памяти — вот она и есть.

319218083_8f7c9994dfb44b1e8d8cdc9b5e00a8b3_240x240.jpg

319218083_fd8e048a5ff65180a6b2094e8ca2cd6d_240x240.jpg


? Вывод:
У тебя всё правильно с логикой, просто последняя итерация заходит за границу массива.

Исправь условие цикла или добавь if, и всё будет работать.

Ошибка 0xC0000005 = всегда выход за пределы памяти или попытка записи в запрещённую область.
 
Сверху Снизу