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

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

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


person user3335653    schedule 21.02.2014    source источник
comment
Изменение строкового литерала дает неопределенное поведение, так что может случиться что угодно.   -  person Jerry Coffin    schedule 21.02.2014
comment
Это просто кусок байта в памяти.   -  person OldProgrammer    schedule 21.02.2014
comment
Это даже не должно компилироваться, строковый литерал имеет тип const char[]   -  person Sebastian Hoffmann    schedule 21.02.2014
comment
Именно поэтому вы не должны использовать неконстантный char * для указания на строковый литерал.   -  person chris    schedule 21.02.2014
comment
Потому что это не постоянный литерал. Используйте 1_.   -  person Paweł Stawarz    schedule 21.02.2014
comment
@Paranaix, с C++ 11 этого не должно быть. До этого это было исключением, и, насколько мне известно, все версии C это допускают.   -  person chris    schedule 21.02.2014
comment
@Paranaix Несмотря на то, что это устарело, преобразование символьного литерала в char* существовало в C ++ 03.   -  person Angew is no longer proud of SO    schedule 21.02.2014
comment
Я сомневаюсь, что вывод будет abZishek, если вы не используете индекс цикла. И сделайте резервную копию ваших данных перед их использованием, потому что доступ с индексом 9 - это UB.   -  person manuell    schedule 27.02.2014


Ответы (2)


Согласно разделу 2.14.5, параграфу § 11 стандарта C++, он вызывает неопределенное поведение:

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

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

person 4pie0    schedule 21.02.2014
comment
Верно ли это правило и для c или оно применимо только в c++? - person user3335653; 22.02.2014
comment
да, в C также поведение не определено, если программа пытается изменить какие-либо строковые литералы. - person 4pie0; 22.02.2014

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

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

person Lightness Races in Orbit    schedule 21.02.2014
comment
Я не включал библиотеки, потому что это очевидно. Что нужно включать. Я учусь на последнем курсе Btech и хочу стать программистом Java, и у меня есть сертификат по Java. Я хочу читать только C и C++ до уровня, на котором я могу пройти письменный тест compnies. Я использую для проверки ваших навыков C в C для практики и головы сначала C для теории. Что еще я должен использовать ?? - person user3335653; 22.02.2014
comment
@ user3335653: Совершенно не очевидно, что вы включили правильные, если не показываете их нам. Вот ваша рекомендация по книге: stackoverflow .com/questions/388242/ - person Lightness Races in Orbit; 22.02.2014