snprintf, который вызывает malloc, или snprintf, который не вызывает malloc - PullRequest
1 голос
/ 24 июля 2011

Мне нужен вариант snprint, который гарантирует, что он никогда не вызовет malloc.
Это потому, что этот snprintf (назовем его safe_snprint ()) будет
вызываться из тех мест, где malloc не будет работать или тупик.

Что ближе к истине, 1 или 2?

  1. В Windows собственный snprintf может вызывать malloc. Тогда
    мне нужно вытащить с открытым исходным кодом snprintf.c и назвать его safe_snprintf (). Или

  2. В Windows собственный snprint гарантированно никогда не вызовет malloc.

Я бы предпочел (2), если это где-то задокументировано. Спасибо

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Реализация _snprintf() в библиотеках VC (MSVCRT) будет вызывать malloc только при преобразованиях с плавающей запятой, если и только если (iff) точность формата превышает 163 символа. Это относится к спецификаторам формата %E %G %A %e %f %g и %a.

Это должно применяться ко всем выпускам MSVCRT начиная с версии 6.

1 голос
/ 24 июля 2011

Я не могу найти документацию в соответствии с реализацией windows snprintf, но эта ссылка утверждает, что может быть причина для внутреннего вызова malloc.Также я не думаю, что какой-либо стандарт запрещает разработчикам использовать его.Поэтому я рекомендую вам использовать первый подход. Здесь вы можете найти список snprintf реализаций.

0 голосов
/ 24 июля 2011

Нет причин, по которым snprintf () должен вызывать malloc ().Точка.

Но, однако, вы не можете быть уверены, не просмотрев источник.И даже тогда вы не можете быть уверены, что так будет и дальше.

Если вы хотите быть абсолютно уверены, чем вы, возможно, захотите реализовать свой собственный snprintf ().

...