Почему значение изменяется в строковом литерале [duplicate]

0
main()
{
  char *c="abhishek";
  int i;
  c[2]=90;
  for(i=0;i<12;i++)
  {
    printf("%c",c[0])
  }
}

Здесь вывод - это abZishek. Но это должно привести к ошибке шины, потому что это строковый литерал, и мы не можем изменить его значение. Почему изменяется значение c?

  • 7
    Изменение строкового литерала дает неопределенное поведение, поэтому может произойти все что угодно.
  • 0
    Это просто кусок байтов в памяти.
Показать ещё 6 комментариев
Теги:
string-literals
undefined-behavior

2 ответа

7

В соответствии с разделом 2.14.5 пункта § 11 в C++ стандарт, он вызывает неопределенное поведение:

Эффект попытки изменить строковый литерал не определен.

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

  • 0
    Это правило также верно для c или оно применимо только в c ++
  • 0
    да, в C поведение также не определено, если программа пытается изменить любые строковые литералы.
3

"Неопределенное поведение" не гарантирует "ошибку шины" или любую другую ошибку. В общем, это не может быть легко обнаружено, поэтому ваш компилятор не обязан беспокоиться. Здесь это не беспокоит. Однако при этом вы можете вызвать непредсказуемые или странные вещи.

Вам также не хватает библиотеки и тип возврата для main; какую C++ книгу вы используете?

  • 0
    Я не включил библиотеки, потому что это очевидно. Что нужно включить? Я студент последнего курса в Btech и хочу быть программистом Java>, и я сертифицирован в Java. Я хочу читать только c и c ++ до уровня, на котором я могу пройти письменный тест compnies.I я использую проверить ваши навыки c в c для практики и голову сначала c для теории. Что еще я должен использовать ??
  • 0
    @ user3335653: Не совсем очевидно, что вы использовали правильные, если не показывали их нам. Вот рекомендация вашей книги: stackoverflow.com/questions/388242/…

Ещё вопросы

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