Ответ 1
Нет, нет гарантии, что этого не произойдет. Однако большинство реализаций, которые я видел, обычно используют буфер фиксированного размера для создания форматированной выходной строки (a).
В терминах glibc (источник здесь), есть вызовы malloc
внутри stdio-common/vfprintf.c
, которые многие из семейства printf
используют на нижний конец, поэтому я бы не стал полагаться на него, если бы был вами. Даже вывод строки-буфера вызывает, например, sprintf
, который, по вашему мнению, не понадобится, кажется, что он разрешает этот вызов после настройки некоторых сложных FILE
-подобных строковых дескрипторов - см. libio/iovsprintf.c
.
Мой совет заключается в том, чтобы затем написать свой собственный код для выполнения вывода, чтобы гарантировать, что выделение памяти не выполняется под капотом (и, надеюсь, конечно, что write
сам не делает этого (не более чем *printf
делать это)). Поскольку вы, вероятно, не собираетесь выводить много преобразованных файлов в любом случае (возможно, просто "Dang, I done run outta memory!"
), необходимость форматированного вывода в любом случае должна быть сомнительной.
(a) Экологические соображения C99 указывают на то, что (по крайней мере) некоторые ранние реализации имели предел буферизации. Из моей памяти о вещах Turbo C я думал, что 4K находится на пределе и действительно, C99 состояния (в 7.19.6.1 fprintf
):
Количество символов, которые могут быть получены с помощью любого единственного преобразования, должно быть не менее 4095.
(мандат на C89 заключался в кодификации существующей практики, а не в создании нового языка, и одна причина, по которой некоторые из этих минимальных максимумов были помещены в стандарт, - они переносились на последующие итерации стандарта).