Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що відбувається при виході за межі масиву?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Вихід за межі масиву** означає, що програма звертається до елемента за індексом, якого не існує - наприклад, до `A[5]` у масиві з 5 елементів, де допустимі лише індекси 0-4. **Ключове:** у "безпечних" мовах (Python, Java, C#) це викликає помилку на кшталт `IndexError`, а в низькорівневих (C, C++) - це undefined behavior, яке може призвести до пошкодження пам'яті або вразливостей.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняВихід за межі масиву означає, що програма намагається звернутися до елемента **за індексом, якого не існує** - наприклад, якщо масив із 5 елементів, а звернення йде до `A[5]` або `A[-2]` (там, де допустимі лише індекси 0-4). --- ### **1. Що це означає технічно** Масив зберігається **у безперервній області пам'яті**, і при виході за межі програма починає звертатися **до комірок, які їй не належать**. Це означає, що вона читає або змінює чужі дані в пам'яті - **пам'ять, виділену під інші змінні або системні дані**. --- ### **2. Що відбувається в різних мовах** | Мова | Читання `arr[i]` поза діапазоном | Запис `arr[i] = x` поза діапазоном | Коментар | |---|---|---|---| | **JavaScript (Array)** | `undefined` | Зазвичай розширює масив (якщо `i >= length`), створює "дірки" (holes) | `arr[-1]` - це **не індекс**, а властивість об'єкта (як `arr["-1"]`) | | **TypeScript** | Як у JS у рантаймі | Як у JS у рантаймі | TS може підсвітити типами, але поведінку не змінює | | **Python (list)** | `IndexError` | `IndexError` | Від'ємні індекси **дозволені**: `a[-1]` - останній елемент | | **Java** | `ArrayIndexOutOfBoundsException` | `ArrayIndexOutOfBoundsException` | Завжди перевірка меж для масивів | | **C# (.NET)** | `IndexOutOfRangeException` | `IndexOutOfRangeException` | Для `Span<T>`/`List<T>` теж перевіряється; в `unsafe` можна інакше | | **Go (slice/array)** | `panic: runtime error: index out of range` | `panic` | Слайси суворо перевіряються | | **Rust (Vec/array)** | `panic` (при `v[i]`) / `None` (при `v.get(i)`) | `panic` (при `v[i]=...`) | Ідіоматично: `get()`, щоб без паніки | | **C (звичайний масив)** | **Undefined Behavior** (може "працювати", може впасти, може зіпсувати пам'ять) | **Undefined Behavior** | Жодних гарантій, можливі вразливості | | **C++ (operator[])** | **Undefined Behavior** | **Undefined Behavior** | `at()` у `std::vector` кидає `std::out_of_range` | | **Swift (Array)** | Runtime trap (крах) | Runtime trap (крах) | Можна робити безпечні обгортки/перевірки | | **Kotlin (Array/List)** | `IndexOutOfBoundsException` | `IndexOutOfBoundsException` | На JVM - по суті поведінка Java | --- ### **3. Можливі наслідки** - **Збій програми (crash)** Система зупиняє виконання при спробі звернення до чужої пам'яті. - **Пошкодження даних** Програма може непомітно змінити змінні в сусідніх ділянках пам'яті. - **Вразливості** У низькорівневих мовах це може бути використано для злому (buffer overflow). --- ### **4. Приклад** ```c int a[3] = {10, 20, 30}; printf("%d", a[5]); // звернення до неіснуючого елемента ``` → програма може вивести випадкове значення, впасти, або пошкодити пам'ять. --- **Підсумок:** > При виході за межі масиву програма звертається до чужої пам'яті. > У "безпечних" мовах це викликає помилку; у низькорівневих - призводить до непередбачуваної поведінки або навіть вразливості.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.