[英]C++ Why does sprintf_s format change when used with void pointer?
這是有效的原始代碼:
// ...
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
的format參數從%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");
我建議簡化一下:
std::ostringstream buffer;
buffer << num;
即使它們對於內部化/自定義可能很笨拙; 用於簡單格式化的流非常簡單...並且安全 。
您可以安全地將%p
用作類型為void *
值的相應printf
格式說明符。
當然,我也建議您在這里研究一個更安全的實現。 您的addBuffered
函數不是可變參數嗎? 您可能會改用vsprintf_s
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.