C++ 为什么在与 void 指针一起使用时 sprintf_s 格式会发生变化?

标签 c++ printf

这是工作的原始代码:

// ...
unsigned __int64 num = 57;
sprintf_s(buffer, sizeof(buffer), "%llu", num);

但是,当我尝试将这部分提取到此函数中时:

void addBuffered(void** attributeValue, char* format)
{
    sprintf_s(buffer, sizeof(buffer), format, *attributeValue);
}

通过调用:

addBuffered((void**)&num, "%d");

我必须将 sprintf_s 中的格式参数从 %llu 更改为 %d 以获得正确的值。有人可以解释为什么会发生这种情况,以及将参数更改为 %d 是否会成为问题?谢谢!

最佳答案

发生这种情况是因为 sizeof(void *) == 4 在您的情况下。并且您通过函数调用将 __int64 隐式转换为 void *。所以如果你使用 %llu 格式,你会从内存中打印一些垃圾。

如果可能,我建议你重写函数:

template <typename T>
void addBuffered(T *attributeValue, char* format)
{
    sprintf_s(buffer, sizeof(buffer), format, *attributeValue);
}

调用示例:

addBuffered(&num, "%luu");

关于C++ 为什么在与 void 指针一起使用时 sprintf_s 格式会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340439/

相关文章:

c - 使用 C 编程语言未打印句子的起始词

c - 如何确定真正需要的char数组的大小?

c++ - 'short int'持有的值溢出了,但 'auto'没有?

c - 为什么 sprintf 在一个例子中起作用,而在下一个例子中不起作用?

c++ - 避免在 ctor 初始化列表中的字符串赋值中重复调用函数

c++ - boost C++ : how to return file from folder via tcp?

c - C 中奇怪的 int 输出

c - 将 int 存储在 char* 中 [C]

c++ - 如何在 Netbeans 中创建跨平台 C++ 应用程序?

C++:std::tuple_size/tuple_element 可以专门化吗?