Ошибки сегментации: что это такое и общие советы о том, как их избежать?

#segmentation-fault

#ошибка сегментации

Вопрос:

Большинство источников, с которыми я сталкиваюсь, определяют ошибки сегментации примерно так: они возникают, когда программа ссылается на неопределенную область виртуальной памяти

Но поскольку я еще не посещал занятия по операционным системам, я обычно понятия не имею, что это значит, что это «неопределенная область» виртуальной памяти…

Кроме того, многие мои программы на C, как правило, сталкиваются с ошибкой сегментации, и, к сожалению, я понятия не имею, как их исправить. Есть ли какие-либо хорошие советы о том, как избежать этих ошибок, и что делать, если они возникли, когда вся логика программы кажется в порядке?

Комментарии:

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

Ответ №1:

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

Простой пример — использование переменной в стеке, за которой следует некоторый код. Допустим, у нас есть

 char a[4];
int i=0;
for(i=0; i<1000;   0)
     a[i]='a';
printf("Hi this line will never get printed because last line killed itn");
  

Итак, в стеке у нас есть 4 байта, выделенных для ‘a’, еще 4 для int ‘i’, и теперь у нас есть код, который является функцией. Дело в том, что оператор for записывает 1000 байт в ‘a’, который перезаписывает ‘i’, а также уничтожает следующий за ним код.