Что такое ошибка времени выполнения 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 ;

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