char* p = "some literal";
Это законно только из-за вонючего аргумента, из-за которого люди категории C спорили во время стандартных переговоров в комитете. Вы должны рассматривать это как странность, которая существует для обратной совместимости.
Это сообщение, которое вы получаете с GCC:
предупреждение: устарело преобразование из строковой константы в 'char*'
Пожалуйста, в следующий раз напишите следующее:
char const* p = "some literal";
И сделайте это рефлексом в ваших привычках кодирования. Тогда вы не смогли бы скомпилировать свою ошибочную строку.
который:
++*ptr
Здесь вы берете первый символ постоянного литерала и пытаетесь увеличить его до того, что идет после H
, следовательно, I
. Но эта зона памяти оказывается на защищенной от записи странице, потому что это константа. Это очень не определено стандартом, и вы должны считать это незаконным. Ваш segfault исходит отсюда. Я предлагаю вам запустить вашу программу в valgrind
в следующий раз, чтобы получить более подробные сообщения об ошибках.
В ответе, который Ю Хао написал для вас, происходит то, что все символы копируются один за другим из пула константных строк, где хранится литерал, в массив символов, выделенный стеком, с помощью кода, который пишет компилятор на сайте инициализации/объявления, поэтому вы можете разыменовать его содержимое.
person
v.oddou
schedule
15.07.2014
(++*)ptr
недопустимый синтаксис! - person M.M   schedule 15.07.2014*(ptr++)
. Возможно, именно это и сбивает с толку, ведь поведение этих двух форм совершенно разное. - person Mark Ransom   schedule 15.07.2014