簡體   English   中英

C ++與空指針一起使用時,為什么sprintf_s格式會更改?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM