4

这是工作的原始代码:

// ...
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_sfrom%llu%d获得正确的值。有人可以解释为什么会发生这种情况以及参数的更改是否%d会成为问题?谢谢!

4

3 回答 3

5

发生这种情况是因为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");
于 2012-07-05T08:29:27.153 回答
1

我建议让它变得简单:

std::ostringstream buffer;

buffer << num;

即使它们对于内部化/定制可能很笨拙;对于简单的格式化流非常简单......而且安全

于 2012-07-05T10:07:28.943 回答
0

您可以安全地将其用作type 值%p的相应格式说明符。printfvoid *

当然,话虽如此,我还建议您在这里查看更安全的实现。你的addBuffered函数不是可变参数的吗?您可能会vsprintf_s改用。

于 2012-07-05T10:13:17.317 回答