2016-11-15 45 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函数族中的任何一个来为您做。这不仅避免了格式字符串的变化,而且还将作者的意图记录下来,在这里没有任何问题没有得到解答。

相关问题