Что такое ошибка времени выполнения SIGSEGV в C ++?
Мне нужно знать основную причину ошибки сегментации, а также может кто-нибудь сказать мне, как с ней справиться.
- Как определить размер моего массива в C?
- Необходимость волатильного модификатора в двойной проверенной блокировке в .NET.
- Как я могу сделать что-то, что ловит все «необработанные» исключения в приложении WinForms?
- Как получить первую запись в каждой группе с помощью Linq
- Почему вы должны использовать strncpy вместо strcpy?
- Таблица приоритетов операторов для языка программирования C
- Положение камеры в мировой координате из cv :: solvePnP
- Каковы потенциальные опасности при использовании boost :: shared_ptr?
В Википедии есть ответ, а также ряд других источников.
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
И вот деталь .
Как с этим справиться?
-
Прежде всего, избегайте его.
Защитите программу: используйте assert (), проверьте указатель NULL, проверьте переполнение буфера.
Используйте инструменты статического анализа, чтобы изучить ваш код.
скомпилируйте свой код с помощью -Werror -Wall.
Кто-нибудь просматривает ваш код.
-
Когда это произошло.
Осмотрите внимательно код.
Проверьте, что вы изменили с момента последнего успешного выполнения кода без сбоя.
Надеюсь, gdb даст вам стек вызовов, чтобы вы знали, где произошел сбой.
EDIT: извините за спешку. Он должен быть *p = 0x1234;
вместо p = 0x1234
;