You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将va_list传入sprintf导致整数数值输出异常

问题根源与解决方法

你的问题出在错误使用了sprintf函数——sprintf不支持直接传入va_list类型的参数。你当前的代码里把argptr(指向参数列表的指针)直接传给sprintf,它会把这个指针本身的内存地址当成格式串对应的整数参数,所以才会输出那些莫名其妙的大数值。

正确的做法是使用专门处理可变参数列表的vsprintf函数,它的设计就是配合va_list来工作的。

修正后的代码

void write_log(const char* format, ...)
{
    char formatted_string[256];

    va_list argptr;
    va_start(argptr, format);
    // 替换sprintf为vsprintf
    int len = vsprintf(formatted_string, format, argptr);
    va_end(argptr);

    // formatted_string sent to JSON builder
}

额外建议:避免缓冲区溢出

如果日志内容可能超过256字节,建议用更安全的vsnprintf,它可以指定最大写入字节数,防止缓冲区溢出:

void write_log(const char* format, ...)
{
    char formatted_string[256];
    const size_t buf_size = sizeof(formatted_string);

    va_list argptr;
    va_start(argptr, format);
    // 第三个参数限制写入的最大字节数,自动追加结束符
    int len = vsnprintf(formatted_string, buf_size, format, argptr);
    va_end(argptr);

    // 返回值大于等于buf_size说明内容被截断,可按需处理
    if (len >= buf_size) {
        // 例如打印警告或扩容缓冲区
    }

    // formatted_string sent to JSON builder
}

内容的提问来源于stack exchange,提问作者zmechanic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:14:54