Может ли кто-нибудь объяснить мне, почему это так показывается
Краткий ответ - "неопределенное поведение", потому что
1) вы пытаетесь напечатать что-то, что не строка, использующая %s
(для которой требуется строка, то есть массив символов, содержащий нулевое окончание '\0'
).
2), который вы читаете за пределами как printf с%s будет продолжать читать, пока не увидит завершение строки.
Из-за неопределенного поведения можно сказать, что нет смысла гадать о том, что происходит.
Если мы все равно это сделаем, это может быть что-то вроде:
Вы используете 6 столбцов и инициализируете их в «0», чтобы память была
'0' '0' '0' '0' '0' '0'
имы не можем сказать, что находится после последнего «0».По «удаче» кажется, что следующая ячейка памяти содержит строковое окончание.Например:
'0' '0' '0' '0' '0' '0' '\0'
^^
A guess...
Теперь вы печатаете его в виде строки, используя %s
(и добавляя пробел).
При первой передаче указателя на первый '0'.
'0' '0' '0' '0' '0' '0' '\0'
^
pointer
, поэтому он выдаст вам отпечаток 6 '0' (и пробел).
Затем вы перемещаете указатель вправо и снова вызываете printf
'0' '0' '0' '0' '0' '0' '\0'
^
pointer
, поэтому он даст вам отпечаток 5 '0'
Следующие циклы дадут 4 '0', затем 3, затем 2, затем 1, и вы получите
000000 00000 0000 000 00 0
Но опять же - поскольку это действительно неопределенное поведение, это просто предположение.Все могло произойти.