调用malloc的snprintf,或不调用malloc的snprintf

时间:2011-07-23 22:51:52

标签: winapi stdio

我需要snprint的变体,保证它永远不会调用malloc 那是因为这个snprintf(我们称之为safe_snprint())将会发生 从malloc失败或死锁的地方调用。

什么更接近真相,1还是2?

  1. 在Windows上,本机snprintf可能会调用malloc。然后
    我需要拉开源snprintf.c并将其命名为safe_snprintf()。或

  2. 在Windows上,本机snprint保证永远不会调用malloc。

  3. 如果在某处记录,我更愿意(2)。感谢

3 个答案:

答案 0 :(得分:4)

VC库(MSVCRT)中_snprintf()的实现只会在浮点转换时调用malloc,当且仅当(iff)格式精度超过163个字符时。这适用于%E %G %A %e %f %g%a格式说明符。

应该适用于所有版本的MSVCRT,至少从版本6开始。

答案 1 :(得分:1)

我无法根据Windows snprintf实施找到文档,但this link表示可能有理由进行内部malloc调用。此外,我不认为任何标准禁止开发人员使用它。所以我建议你使用第一种方法。 Here您可以找到snprintf实施列表。

答案 2 :(得分:0)

snprintf()没有理由调用malloc()。周期。

但是,如果没有查看来源,你就无法确定。即便如此,你还不能确定它会保持这种状态。

如果你必须绝对确定,那么你可能想要实现自己的snprintf()。