В соответствии с http://linux.die.net/man/3/sprintf и http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf() и семья возвращает количество символов написано об успехе. При сбое возвращается отрицательное значение. Я бы предположил, что ошибка может произойти, если строка формата искажена, поэтому отрицательное возвращаемое значение может указывать на что-то другое, кроме ошибки malloc(). Установлен ли errno, чтобы указать, что такое ошибка?
Sprintf() отрицательное возвращаемое значение и errno
Ответ 1
Отказ С++ от C до C не требует или упоминает errno в описании sprintf() и семейства (хотя для определенных спецификаторов формата эти функции определены для вызова mbrtowc(), который может установить EILSEQ в errno)
POSIX требует, чтобы был установлен errno:
Если возникла ошибка вывода, эти функции должны вернуть отрицательное значение и установить
errnoдля указания ошибки.
EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW указаны явно: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
Ответ 2
Мне всегда нравится метод "попробуйте", когда у меня возникает такой вопрос.
char buffer[50];
int n, localerr = 0;
n = sprintf(buffer, "%s", "hello");
localerr = errno; // ensure printf doesn't mess with the result
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));
> 5 chars
errno: 0
strerror: Success
n = sprintf(buffer, NULL, NULL);
localerr = errno;
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));
> -1 chars
errno: 22
strerror: Invalid argument
Похоже, он устанавливается при компиляции с gcc на linux. Так что хорошие данные и в man page для errno он упоминает, что printf() (то же семейство, что и sprintf()) может измениться errno (в примерах внизу).