Помилка сегментації — Вікіпедія

Помилка сегментації (англ. Segmentation fault) — помилка програмного забезпечення, що виникає при виконанні програми при спробі звернення до відсутніх або захищених від запису ділянок оперативної пам'яті, або при спробі зміни пам'яті забороненим способом (Що це?).

Сегментна адресація пам'яті є одним із підходів до організації, керування і захисту оперативної пам'яті в операційній системі. На окремих апаратних платформах та/або окремих операційних системах вона була доповнена або замінена сторінковою пам'яттю, проте в документаціях за традицією використовують термін «Помилка сегментації». Деякі операційні системи досі використовують сегментацію на деяких логічних рівнях, а сторінкова пам'ять використовується як основна політика управління пам'яттю.

В UNIX-подібних операційних системах процес, який звертається до недійсних ділянок пам'яті, отримує сигнал SIGSEGV. У Microsoft Windows цей процес створює виняток STATUS_ACCESS_VIOLATION, і, як правило, запускає програму налагоджувача Dr. Watson, яка показує користувачеві вікно з пропозицією відправити звіт про помилку Microsoft.

Приклади[ред. | ред. код]

Приклад коду мовою ANSI C, який, як правило, призводить до помилки сегментації на платформах із захистом пам'яті при читанні:

int main() {  int *p = 0;  int a = *p;  return 0; } 

Після запуску змінна p містить нульову адресу службової області пам'яті, яка звичайно доступна лише ядру ОС, спроба прочитати значення за цією адресою призводить до помилки сегментації.

Приклад програми мовою ANSI C, яка, як правило, призводить до помилки сегментації на платформах із захистом пам'яті при запису:

int main() {  const char *s = "hello world";  *(char *)s = 'H';  return 0; } 

При компіляції програми рядок «hello world» буде розміщений в секції програми з бінарною позначкою «тільки для читання». При запуску програми операційна система завантажує цю секцію в сегмент пам'яті, призначений тільки для читання. Після запуску змінна s вказує на адресу рядка, а спроба змінити значення символьної константи h в цій області пам'яті призводить до помилки сегментації.

Див. також[ред. | ред. код]