Что такое ошибка времени выполнения SIGSEGV в C ++?

Мне нужно знать основную причину ошибки сегментации, а также может кто-нибудь сказать мне, как с ней справиться.

В Википедии есть ответ, а также ряд других источников.

Segfault в основном означает, что вы сделали что-то плохое с указателями. Это, вероятно, segfault:

char *c = NULL; ... *c; // dereferencing a NULL pointer 

Или это:

 char *c = "Hello"; ... c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory 

Или, может быть, это:

 char *c = new char[10]; ... delete [] c; ... c[2] = 'z'; // accessing freed memory 

Один и тот же базовый принцип в каждом случае – вы делаете что-то с памятью, которая не принадлежит вам.

Существуют различные причины сбоев сегментации, но в основном вы неправильно обращаетесь к памяти. Это может быть вызвано разыменованием нулевого указателя или попыткой изменить память в режиме readonly или с помощью указателя на то место, которое не отображается в пространство памяти вашего процесса (это, вероятно, означает, что вы пытаетесь использовать число в качестве указателя , или вы увеличили указатель слишком далеко). На некоторых машинах возможен неправильный доступ через указатель, чтобы вызвать проблему – если у вас есть нечетный адрес и, например, попытаться прочитать четное количество байтов из него (вместо этого можно создать SIGBUS).

используя недопустимый / нулевой указатель? Переопределение границ массива? Kindof трудно быть конкретным без какого-либо образца кода.

По сути, вы пытаетесь получить доступ к памяти, которая не принадлежит вашей программе, поэтому ОС убивает ее.

Вот пример SIGSEGV.

 [email protected]:/opt/playGround# cat test.c int main() { int * p ; * p = 0x1234; return 0 ; } [email protected]:/opt/playGround# g++ -o test test.c [email protected]:/opt/playGround# ./test Segmentation fault 

И вот деталь .

Как с этим справиться?

  1. Прежде всего, избегайте его.

    Защитите программу: используйте assert (), проверьте указатель NULL, проверьте переполнение буфера.

    Используйте инструменты статического анализа, чтобы изучить ваш код.

    скомпилируйте свой код с помощью -Werror -Wall.

    Кто-нибудь просматривает ваш код.

  2. Когда это произошло.

    Осмотрите внимательно код.

    Проверьте, что вы изменили с момента последнего успешного выполнения кода без сбоя.

    Надеюсь, gdb даст вам стек вызовов, чтобы вы знали, где произошел сбой.


EDIT: извините за спешку. Он должен быть *p = 0x1234; вместо p = 0x1234 ;

Interesting Posts
Давайте будем гением компьютера.