Вы распределили свою собственную память, поэтому вы должны управлять ей ответственно. В вашем примере вы выделили 5 байт оперативной памяти и создали указатель, который указывает на первый адрес этой памяти. Ваш указатель не является строкой, это не массив. Итак, вы сделали 6 байтов, начиная с адреса, на который указывает указатель. 6-й байт переполняется в нераспределенной памяти. Итак, вы записали это в память, которая может быть использована для чего-то другого и может вызвать неизвестные проблемы. Вы создали утечку и не освободили память, выделенную при выходе из программы, что является еще одной утечкой. Вы нигде не добавили / 0, так что, честно говоря, вам повезло. На самом деле нет никакого способа узнать, как strlen () ответит. Если вы хотите, чтобы C обработал это для вас, тогда у вас есть char *str = "abcdef"
, и это создаст строку длиной 6 плюс / 0. Но если вы делаете это вручную, как вы, то вы должны справиться со всем.