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

C可变参数log函数调用snprintf输出随机值问题排查求助

问题根因

代码存在两处标准用法错误,和编译器无关:

  • 错误使用snprintf处理va_list参数:snprintf直接接受可变参数列表,不能传入已经封装好的va_list类型对象,该场景下需要改用vsnprintf完成格式化。你当前的写法会导致参数解析完全错位,读取到栈上的随机内存值,所以输出的数字每次运行都会变化。
  • 格式化符与变量类型不匹配:lnum的类型是无符号的size_t,但你使用了对应有符号int的%d格式化,属于未定义行为,会额外增加参数偏移错误的概率。

修复后代码

#include <fstream>
#include <cstdlib>
#include <iostream>
#include <cstdarg>

void log(const char *file_name, size_t lnum, const char *func_name, const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    char y[2048];
    // 替换为vsnprintf处理va_list
    vsnprintf(y, sizeof(y), fmt, args);

    va_end(args);

    char x[256];
    // size_t类型使用%zu作为格式化符
    snprintf(x, sizeof(x), ":%s:%zu:%s:", file_name, lnum, func_name);

    std::cout << x << y;
}

int main()
{
    int idx = -2;

    log(__FILE__, __LINE__, __func__, "this should be -2!? --> %d <--\n", idx);
}

额外提示

编译时加上-Wall -Wextra参数开启基础警告,g++会直接提示这两处错误,不用自行排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:45:03