Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Ошибка сегментации - Пример23 января 2011Оглавление: 1. Ошибка сегментации 2. Пример Вот пример кода ANSI C, который приводит к ошибке сегментации на платформах с защитой памяти: char *s = "hello world"; *s = 'H'; Когда программа, содержащая этот код, скомпилирована, строка «hello world» размещена в секции программы с бинарной пометкой «только для чтения». При запуске операционная система помещает её с другими строками и константами в сегмент памяти, предназначенный только для чтения. После запуска переменная s указывает на адрес строки, а попытка присвоить значение символьной константы H через переменную в памяти приводит к ошибке сегментации. Компиляция и запуск таких программ на OpenBSD 4.0 вызывает следующую ошибку выполнения:
Вывод отладчика gdb:
} В отличие от этого, gcc 4.1.1 на Linux возвращает ошибку ещё во время компиляции:
Условия, при которых происходят нарушения сегментации, и способы их проявления зависят от операционной системы. Этот пример кода создаёт нулевой указатель и пытается присвоить значение по несуществующему адресу. Это вызывает ошибки сегментации во время выполнения программы на многих системах. int* ptr = 0; *ptr = 1; Ещё один способ вызвать ошибку сегментации заключается в том, чтобы вызвать функцию main рекурсивно, что приведёт к переполнению стека:
int main
{
main;
}
Обычно, ошибка сегментации происходит потому что: указатель или нулевой, или указывает на произвольный участок памяти, или указывает на удаленный участок памяти. Например,
char* p1 = NULL; /* инициализирован как нулевой, в чем нет ничего плохого, но на многих системах он не может быть разыменован */
char* p2; /* вообще не инициализирован */
char* p3 = malloc; /* хорошо, участок памяти выделен */
free; /* но теперь его больше нет */
Теперь разыменование любого из этих указателей вызовет ошибку сегментации. Также, при использовании массивов, если случайно указать вместо максимального размера массива его текущий. Вот пример :
int main
{ int const nmax=10;
int i,n,a;
}
такая ошибка не прослеживается g++ при линковке, но при ./a.out вызовет ошибку сегментации Просмотров: 2404
|