2016-11-15 42 views
0

Retrieving the Last-Error Code MSDN上的代碼示例說明此代碼:爲什麼將40添加到傳遞給LocalAlloc的大小?

​​

稍後用於

StringCchPrintf((LPTSTR)lpDisplayBuf, 
    LocalSize(lpDisplayBuf)/sizeof(TCHAR), 
    TEXT("%s failed with error %d: %s"), 
    lpszFunction, dw, lpMsgBuf); 

我很好奇,想知道到底爲什麼這加入?

這是一些安全邊界嗎?或者微軟試圖告訴我們關於StringCchPrintf的一些事情?或者是其他東西?

+6

您需要爲'dw'的所有可能數字加上文本信息本身。 '40'可能有點矯枉過正,但不是太多。 –

+0

這是一個在硬敲門學院教授的做法。有人將本地化字符串,並幾乎保證忘記注意數字。 StringCchPrintf()將始終讓他擺脫困境,但德國的bug報告仍然存在一些可能性:) –

回答

4

給定格式字符串%s failed with error %d: %s,有21個字符的文本(" failed with error "": ")。錯誤代碼的最長表示(十進制中的0x8FFFFFFF或-1879048193)長度爲11個字符。採用另一個字符作爲空終止符,並且總共有33個字符,加上兩個輸入字符串的長度。代碼因此爲7個字符過度分配空間。

這可能意味着作者很匆忙,估計需要的緩衝區大小,以防萬一,或者技術作家修復錯誤文本而未考慮代碼中的錯誤文本。

我們並不知道,但如果您使用的是Visual Studio,並且不想自己做數學計算,則可以通過調用_vsctprintf函數族中的任何一個來爲您做。這不僅避免了格式字符串的變化,而且還將作者的意圖記錄下來,在這裏沒有任何問題沒有得到解答。

相關問題