Существует ли ограничение на количество значений, которое может быть напечатано одним вызовом printf?

Число значений, напечатанных printf, зависит от памяти, выделенной для конкретной программы, или может продолжать печатать значения?

Ответы

Ответ 1

Стандарт C документирует минимальное количество аргументов, которые компилятор должен принять для вызова функции:

C11 5.2.4.1 Пределы перевода

Реализация должна иметь возможность переводить и выполнять хотя бы одну программу, содержащую хотя бы один экземпляр каждого из следующих ограничений:

  • ...

  • 127 аргументов в одном вызове функции

  • ...

Следовательно, вы должны иметь возможность передавать по меньшей мере 126 значений в printf после строки исходного формата, считая, что строка формата правильно построена и соответствует фактическим аргументам, которые следуют.

Если строка формата является строковым литералом, стандарт гарантирует, что компилятор может обрабатывать строковые литералы длиной не менее 4095 байтов, а строки источника - не менее 4095 символов. Вы можете использовать конкатенацию строк для разделения литерала на несколько исходных строк. Если вы используете массив char для строки формата, такого ограничения не существует.

Единственный экологический предел, зарегистрированный для семейства функций printf, таков:

Количество символов, которые могут быть созданы с помощью любого преобразования, должно быть не менее 4095

Это делает поведение формата %10000d в лучшем случае определяемым реализацией, но стандарт ничего не требует.

Соответствующая комбинация компилятора/библиотеки должна принимать не менее 126 значений для printf, независимо от того, может ли ваша среда разрешить даже большее количество аргументов при реализации и документирована как таковая, но не гарантируется стандартом.