ПРИМЕЧАНИЕ: C конкретный ответ ->
Ниже приведены типичные причины этого нарушения сегментации или ошибки сегментации:
Неправильная строка управления форматом в инструкциях printf или scanf:
Убедитесь, что строка управления форматом имеет то же количество спецификаторов преобразования (%), что и у printf или scanf аргументы для печати или чтения, соответственно, и что спецификаторы соответствуют типу переменной, которая будет напечатана или прочитана. Это также относится к fprintf и fscanf.
Забывает использовать «&» в аргументах для scanf:
Функция scanf принимает в качестве аргументов строку управления форматом и адреса переменных, в которые она будет помещать данные, в которые она читает. Оператор «&» (address of) используется для предоставления адреса переменной. Обычно забывают использовать «&» с каждой переменной в вызове scanf. Пропуск знака «&» может вызвать нарушение сегментации.
Доступ за пределы массива:
Убедитесь, что вы не нарушили границы любого используемого вами массива; т.е. вы не подписали массив со значением, меньшим, чем индекс его самого низкого элемента или больше, чем индекс его самого высокого элемента.
Не удалось инициализировать указатель перед доступом к нему:
Переменной указателя должен быть присвоен действительный адрес (т. Е. Появится слева от присвоения) перед тем, как к нему будет осуществлен доступ (т. Е. Появится справа от назначения). Убедитесь, что вы инициализировали все указатели, чтобы указать на допустимую область памяти. Правильная инициализация указателя может быть выполнена несколькими способами. Примеры перечислены ниже.
Неправильное использование операторов «&» (адрес) и «» (разыменование):
Убедитесь, что вы понимаете, как работают эти операторы. Знайте, когда их следует применять, а когда не применять. Как упоминалось выше, часто забывают использовать «&» с каждой переменной в вызове scanf. Помните, что scanf требует адрес переменных, в которых он читает. Особенно, знайте, когда «&» и «» абсолютно необходимы и когда лучше избегать их использования.
Устранение проблемы:
Проверьте КАЖДОЕ место в вашей программе, которое использует указатели, подписывает массив или использует оператор адреса (&) и оператор разыменования (*). Каждый из них является кандидатом на то, чтобы стать причиной нарушения сегментации. Убедитесь, что вы понимаете использование указателей и связанных с ними операторов.
Если программа использует много указателей и имеет много вхождений & и *, добавьте несколько операторов printf, чтобы точно определить место, в котором программа вызывает ошибку, и исследуйте указатели и переменные, связанные с этим оператором.
Помните, что операторы printf для целей отладки должны иметь символ новой строки (\ n) в конце своих строк управления форматом, чтобы принудительно очищать буфер печати.