«Ошибка сегментации» против ошибки «времени выполнения»?

0

Рассмотрим этот фрагмент фрагмента:

  char *str = "hellow Ghost";
  str[0] = 'z';
  printf("%s", str);

Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?

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

Сколько и какие ошибки памяти покрывает ошибка сегментации и что вызывает ее, чтобы проверить, что указатель или ссылка неверны в отношении памяти.

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

  • 1
    Похоже, вы спрашиваете: «Какие бывают ошибки памяти во время выполнения, кроме segfault?» Это правда?
  • 0
    Насколько я понимаю, ошибка времени выполнения - это любая ошибка, возникающая во время выполнения программы. Therefor ошибка памяти время выполнения ошибка, включая память, что происходит во время выполнения программы. Таким образом, можно сказать, что ошибка сегментации является подклассом или специализацией ошибок памяти во время выполнения. Если память вашей платформы не сегментирована, это не имеет смысла.
Показать ещё 1 комментарий
Теги:
memory
segmentation-fault
runtime

4 ответа

9
Лучший ответ

Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?

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

декларирование

char *str = "hellow Ghost";  

эквивалентно

char const *str = "hellow Ghost";  

Строковые литералы хранятся в разделе только для чтения, и любая попытка его модификации вызывает UB.

C11: J.2 Неопределенное поведение:

Поведение не определено в следующих случаях:
...
- Программа пытается изменить строковый литерал (6.4.5).

  • 0
    @pcGhost; Выбирайте выражения.
  • 0
    Это будет const char* ?
Показать ещё 5 комментариев
5

Это ошибка сегментации. Кроме того, это связано с ошибкой памяти времени выполнения?

Да.

Segfault всегда является ошибкой памяти во время выполнения.

То, что я понял по ошибке сегментации, это: Ошибка сегментации, когда вы обращаетесь к памяти, которая не принадлежит вам.

Нет.

Это может произойти, когда вы получаете доступ к памяти, которая не принадлежит вам. Это симптом проблемы. Но вам не обещали, что это произойдет.

Сколько и какие ошибки памяти покрывает ошибка сегментации и что вызывает ее, чтобы проверить, что указатель или ссылка неверны в отношении памяти.

Это означает, что вы получили доступ к сегменту памяти, который не был зарезервирован для вашего процесса. Ваша конкретная ОС реализует это. Или это не так. Это не требуется.

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

Если произойдет segfault, вы гарантированно получите ошибку памяти во время выполнения.

Если произошла ошибка во время выполнения, вам не гарантируется segfault.

1

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

Точный смысл "segfault" или "segmentation fault" может варьироваться в зависимости от действия и окружающей среды; это может означать, что вы пытаетесь получить доступ к имеющейся у вас памяти, или что вы пытаетесь выполнить запрещенную операцию (изменение памяти только для чтения, что вы пытаетесь сделать в этом случае), или что вы пытаетесь разыменовать недопустимое значение указателя (например, NULL) или что-то еще.

Обратите внимание, что язык C не требует, чтобы segfault возникал при попытке изменить строковый литерал; он только утверждает, что поведение не определено. Segfault - одна из нескольких возможностей. Другим возможным результатом является то, что код ведет себя так, как вы ожидали.

0

Изменение строкового литерала - неопределенное поведение. В большинстве реализаций вы получите segfault.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню