Это ситуация, когда результаты могут выглядеть правильно, но вам просто «везет» с выходом вашей программы.
Во-первых, когда вы вызываете malloc(INPUT_SIZE)
, ваша реализация lib c обычно не выделяет только 5 байтов, но фактически несколько кратных 8 байтов (например, 16 или 32, зависит от платформы [см. неожиданный вывод размера, выделенного mallo c в C). Эти дополнительные данные содержат возможные байты заполнения после ваших данных и метаданные до и после запрошенного вами блока. Это сделано в целях выравнивания и учета, но выгода в том, что вы получаете больше, чем просите, когда звоните malloc
.
. Вы не должны использовать эту деталь реализации, чтобы разместить больше данных в malloc
ed регион, который вы запросили, так как это место на самом деле не ваше для взятия. Писая после конца буфера, вы рискуете пометить важные данные, которые необходимы вашему распределителю для обеспечения согласованности.
Во-вторых, поведение нулевого терминатора, которое вы видите, - это просто удача и получение обнуленной части память от malloc
. Это не всегда гарантируется, и в следующий раз, когда вы запустите программу, ваш буфер может вернуться из malloc
, заполненного случайными значениями, вместо 0
. Если вы хотите предварительно обнуленную память, используйте calloc
.
Поэтому, чтобы ответить на вопрос, нет, в конце файлов нет нулевого терминатора, ваша программа просто использует неопределенное поведение стандартной библиотеки. чтобы это выглядело как есть.