Нет, в любом логическом смысле невозможно восстановить нормальное выполнение после ошибки сегментации. Ваша программа просто пыталась разыменовать нулевой указатель. Как вы будете продолжать вести себя как обычно, если чего-то, чего ваша программа ожидает, не будет? Это программная ошибка, единственное, что можно сделать безопасно - это выйти.
Рассмотрим некоторые возможные причины ошибки сегментации:
- вы забыли присвоить правильное значение указателю
- указатель был перезаписан, возможно, из-за того, что вы обращаетесь к освобожденной памяти кучи
- ошибка повредила кучу
- ошибка повредила стек
- злонамеренная третья сторона пытается использовать уязвимость переполнения буфера
- malloc возвратил ноль, потому что у вас недостаточно памяти
Только в первом случае можно ожидать каких-либо разумных ожиданий, которые вы могли бы продолжить
Если у вас есть указатель, который вы хотите разыменовать, но он может быть на законном основании равен нулю, вы должны проверить его перед попыткой разыменования . Я знаю, вы не хотите, чтобы я вам это говорил, но это правильный ответ, такой жесткий.
Редактировать: вот пример, показывающий, почему вы определенно не хотите выполнять следующую инструкцию после разыменования нулевого указателя:
void foobarMyProcess(struct SomeStruct* structPtr)
{
char* aBuffer = structPtr->aBigBufferWithLotsOfSpace; // if structPtr is NULL, will SIGSEGV
//
// if you SIGSEGV and come back to here, at this point aBuffer contains whatever garbage was in memory at the point
// where the stack frame was created
//
strcpy(aBuffer, "Some longish string"); // You've just written the string to some random location in your address space
// good luck with that!
}