这是工作的原始代码:
// ...
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/