Помилка сегментації

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

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

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

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

 const char *s = "hello world";
 *(char *)s = 'H';

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

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