Показанный код явно не неопределенное поведение, так как *fubar++
в некоторой степени равен char result; (result = *fubar, fubar++, result)
, то есть он увеличивает указатель, а не разыменованное значение, и результатом выражения является(разыменование) значение *fubar
до увеличения указателя.*fubar++
фактически дает вам значение символа, на которое изначально указывает fubar
, но вы просто не используете этот «результат» и игнорируете его.
Обратите внимание, однако, что следующий код делает вводит неопределенное поведение:
char *fubar = "hello world";
(*fubar)++;
Это потому, что это увеличивает значение, на которое указывает fubar
, и тем самым манипулирует строковым литералом -> неопределенное поведение.
При замене строкилитерал с массивом символов, затем все снова в порядке:
int main() {
char test[] = "hello world";
char* fubar = test;
(*fubar)++;
printf("%s\n",fubar);
}
Вывод:
iello world