Есть ли ограничение по длине для fprintf?

A есть следующий код c ansi, в версии Linux 2.6.32-431.11.2.el6.x86_64

    fprintf(fpOut, "%s",cBuffer);

Где cBuffer — указатель на char, например

    int bfnAddOutputFile(FILE *fpOut, char *cBuffer){/**/

        fprintf(fpOut, "%s",cBuffer);

        //code

        return ( TRUE );
    }

Когда он выполняет fprintf, генерирует дамп ядра

    Program received signal SIGSEGV, Segmentation fault.
    0x00000038b2e6723e in fputs () from /lib64/libc.so.6

Существует максимальная длина символа, которую можно отправить в fprintf, и если это так, то какой это номер?


person Alejandro Montilla    schedule 25.10.2016    source источник
comment
это cBuffer строка ASCIIZ?   -  person Iłya Bursov    schedule 25.10.2016
comment
Непонятно, почему вы падаете, поэтому почему вы думаете, что это проблема длины?   -  person 2501    schedule 25.10.2016
comment
Взгляните на этот связанный пост максимальный размер printf/fprintf в соответствии с c99.   -  person J. Piquard    schedule 25.10.2016
comment
Ваша строка, вероятно, не заканчивается нулевым байтом. Замените fprintf(fpOut, "%s",cBuffer); на printf("%zd\n",strlen(cBuffer)); и посмотрите, повторяется ли ошибка.   -  person r3mainer    schedule 25.10.2016
comment
Вы имеете в виду strlen, @squeamishossifrage? Если да, то (1) strlen(), скорее всего, будет страдать от той же проблемы, и (2) правильным дескриптором поля будет %zx, а не %xd.   -  person John Bollinger    schedule 25.10.2016
comment
@JohnBollinger Да. (Все еще надел шляпу Python!)   -  person r3mainer    schedule 25.10.2016


Ответы (1)


cBuffer, вероятно, не содержит нуль-терминатора, из-за чего fprintf превышает границы памяти.

При выводе C-строки функции семейства printf останавливаются только тогда, когда они встречают нуль-терминатор ('\0'), и могут продолжать работу в противном случае, пока не попытаются вывести часть памяти, которая не работает. не принадлежат вашей программе, что вызывает ошибку сегментации.

person ForceBru    schedule 25.10.2016
comment
Хотя это и не случай OP, [f|s]printf может остановиться до встречи с терминатором строки, если задана ширина поля. - person John Bollinger; 25.10.2016
comment
cBuffer был слишком мал, поэтому нуль-терминатор не содержался в fprintf. - person Alejandro Montilla; 25.10.2016
comment
@JohnBollinger Подозреваю, что вы имеете в виду точность, а не ширину поля. - person chux - Reinstate Monica; 25.10.2016
comment
Ты прав, @chux. Функции семейства printf не будут выводить больше символов строкового аргумента, чем поле precision, а не ширина. Например, можно использовать что-то вроде этого: fprintf(fpOut, "%.255s",cBuffer);. - person John Bollinger; 25.10.2016