Skip to main content

Що відбувається при виході за межі масиву?

Вихід за межі масиву означає, що програма намагається звернутися до елемента за індексом, якого не існує - наприклад, якщо масив із 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)IndexErrorIndexErrorВід'ємні індекси дозволені: a[-1] - останній елемент
JavaArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionЗавжди перевірка меж для масивів
C# (.NET)IndexOutOfRangeExceptionIndexOutOfRangeExceptionДля Span<T>/List<T> теж перевіряється; в unsafe можна інакше
Go (slice/array)panic: runtime error: index out of rangepanicСлайси суворо перевіряються
Rust (Vec/array)panic (при v[i]) / None (при v.get(i))panic (при v[i]=...)Ідіоматично: get(), щоб без паніки
C (звичайний масив)Undefined Behavior (може "працювати", може впасти, може зіпсувати пам'ять)Undefined BehaviorЖодних гарантій, можливі вразливості
C++ (operator[])Undefined BehaviorUndefined Behaviorat() у std::vector кидає std::out_of_range
Swift (Array)Runtime trap (крах)Runtime trap (крах)Можна робити безпечні обгортки/перевірки
Kotlin (Array/List)IndexOutOfBoundsExceptionIndexOutOfBoundsExceptionНа JVM - по суті поведінка Java

3. Можливі наслідки

  • Збій програми (crash) Система зупиняє виконання при спробі звернення до чужої пам'яті.
  • Пошкодження даних Програма може непомітно змінити змінні в сусідніх ділянках пам'яті.
  • Вразливості У низькорівневих мовах це може бути використано для злому (buffer overflow).

4. Приклад

c
int a[3] = {10, 20, 30}; printf("%d", a[5]); // звернення до неіснуючого елемента

→ програма може вивести випадкове значення, впасти, або пошкодити пам'ять.


Підсумок:

При виході за межі масиву програма звертається до чужої пам'яті. У "безпечних" мовах це викликає помилку; у низькорівневих - призводить до непередбачуваної поведінки або навіть вразливості.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.