Що відбувається при виході за межі масиву?
Вихід за межі масиву означає, що програма намагається звернутися до елемента за індексом, якого не існує - наприклад, якщо масив із 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. Приклад
int a[3] = {10, 20, 30};
printf("%d", a[5]); // звернення до неіснуючого елемента→ програма може вивести випадкове значення, впасти, або пошкодити пам'ять.
Підсумок:
При виході за межі масиву програма звертається до чужої пам'яті. У "безпечних" мовах це викликає помилку; у низькорівневих - призводить до непередбачуваної поведінки або навіть вразливості.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.