Рассмотрим этот фрагмент фрагмента:
char *str = "hellow Ghost";
str[0] = 'z';
printf("%s", str);
Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?
То, что я понял по ошибке сегментации, это: Ошибка сегментации, когда вы обращаетесь к памяти, которая не принадлежит вам. Это в основном утилита, созданная для облегчения вашей работы, не позволяя вам испортить память.
Сколько и какие ошибки памяти покрывает ошибка сегментации и что вызывает ее, чтобы проверить, что указатель или ссылка неверны в отношении памяти.
Ошибка времени выполнения также возникает из-за неправильной логики. Кроме того, существуют ли различия между ошибкой времени выполнения и ошибкой сегментации в отношении памяти.
Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?
Строго говоря, это неопределенное поведение. Вы можете или не можете получить ошибку сегментации. Может произойти все, что угодно.
декларирование
char *str = "hellow Ghost";
эквивалентно
char const *str = "hellow Ghost";
Строковые литералы хранятся в разделе только для чтения, и любая попытка его модификации вызывает UB.
C11: J.2 Неопределенное поведение:
Поведение не определено в следующих случаях:
...
- Программа пытается изменить строковый литерал (6.4.5).
const char*
?
Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?
Да.
Segfault всегда является ошибкой памяти во время выполнения.
То, что я понял по ошибке сегментации, это: Ошибка сегментации, когда вы обращаетесь к памяти, которая не принадлежит вам.
Нет.
Это может произойти, когда вы получаете доступ к памяти, которая не принадлежит вам. Это симптом проблемы. Но вам не обещали, что это произойдет.
Сколько и какие ошибки памяти покрывает ошибка сегментации и что вызывает ее, чтобы проверить, что указатель или ссылка неверны в отношении памяти.
Это означает, что вы получили доступ к сегменту памяти, который не был зарезервирован для вашего процесса. Ваша конкретная ОС реализует это. Или это не так. Это не требуется.
существуют ли различия между ошибкой времени выполнения и ошибкой сегментации в отношении памяти.
Если произойдет segfault, вы гарантированно получите ошибку памяти во время выполнения.
Если произошла ошибка во время выполнения, вам не гарантируется segfault.
Segfault является одной из нескольких возможных ошибок времени выполнения; другие ошибки времени выполнения могут включать такие вещи, как деление на ноль, ошибка домена, ошибка диапазона, переполнение стека и т.д.
Точный смысл "segfault" или "segmentation fault" может варьироваться в зависимости от действия и окружающей среды; это может означать, что вы пытаетесь получить доступ к имеющейся у вас памяти, или что вы пытаетесь выполнить запрещенную операцию (изменение памяти только для чтения, что вы пытаетесь сделать в этом случае), или что вы пытаетесь разыменовать недопустимое значение указателя (например, NULL) или что-то еще.
Обратите внимание, что язык C не требует, чтобы segfault возникал при попытке изменить строковый литерал; он только утверждает, что поведение не определено. Segfault - одна из нескольких возможностей. Другим возможным результатом является то, что код ведет себя так, как вы ожидали.
Изменение строкового литерала - неопределенное поведение. В большинстве реализаций вы получите segfault.