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

Winapi 调用malloc的snprintf,或不调用malloc的snprintf,winapi,stdio,Winapi,Stdio,我需要snprint的变体,该变体保证它不会调用malloc。 这是因为这个snprintf(我们称之为safe_snprint())将 从malloc将失败或死锁的位置调用 什么更接近事实,1或2 在Windows上,本机snprintf可能会调用malloc。然后 我需要拉取开源snprintf.c并称之为safe\u snprintf()。或 在Windows上,本机snprint保证从不调用malloc 如果在某处有文档记录,我更喜欢(2)。谢谢没有理由让snprintf()调用mall

我需要snprint的变体,该变体保证它不会调用malloc。
这是因为这个snprintf(我们称之为safe_snprint())将
从malloc将失败或死锁的位置调用

什么更接近事实,1或2

  • 在Windows上,本机snprintf可能会调用malloc。然后
    我需要拉取开源snprintf.c并称之为safe\u snprintf()。或

  • 在Windows上,本机snprint保证从不调用malloc


  • 如果在某处有文档记录,我更喜欢(2)。谢谢

    没有理由让snprintf()调用malloc()。句号

    但是,如果不查看源代码,则无法确定。即使这样,你也不能确定它会保持这种状态


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

    没有理由让snprintf()调用malloc()。句号

    但是,如果不查看源代码,则无法确定。即使这样,你也不能确定它会保持这种状态


    如果您必须绝对确定,那么您可能希望实现自己的snprintf()。

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


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

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


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

    根据windows
    snprintf
    实现,我找不到文档,但声明可能有理由调用内部
    malloc
    。我也不认为任何标准都禁止开发人员使用它。因此,我建议您使用第一种方法。您可以找到
    snprintf
    实现的列表。

    根据windows
    snprintf
    实现,我找不到文档,但声明可能有内部
    malloc
    调用的原因。我也不认为任何标准都禁止开发人员使用它。因此,我建议您使用第一种方法。您可以找到一个
    snprintf
    实现的列表。

    我现在没有MSVC源代码,但是没有理由
    snprintf
    需要进行任何分配。所有需要做的事情都可以使用基于堆栈的内存来完成。目前我手头没有MSVC源代码,但是没有理由要求
    snprintf
    进行任何分配。所有需要做的事情都可以使用基于堆栈的内存来完成。snprintf()在预先分配的内存上工作。它不需要自己的内存。我真的无法想象它为什么会调用malloc()。但你为什么不追踪一下呢?int main(void){char buff[512];snprintf(buff,512,“%d%s”,10,“lala”);}和一个跟踪程序可以告诉您真相。这只涉及一个特定的、小而简单的格式说明符。如果用户打印120k长字符串怎么办?如果调用使用%$说明符怎么办?什么是用户使用%*.*说明符?需要访问源代码才能确保.snprintf()在预先分配的内存上工作。它不需要自己的内存。我真的无法想象它为什么会调用malloc()。但你为什么不追踪一下呢?int main(void){char buff[512];snprintf(buff,512,“%d%s”,10,“lala”);}和一个跟踪程序可以告诉您真相。这只涉及一个特定的、小而简单的格式说明符。如果用户打印120k长字符串怎么办?如果调用使用%$说明符怎么办?什么是用户使用%*.*说明符?我们需要访问源代码才能确定。