为什么40添加到传递给LocalAlloc的大小?

时间:2016-11-15 13:45:27

标签: c winapi buffer allocation

MSDN上Retrieving the Last-Error Code的示例代码显示了以下代码:

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
    (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));

稍后将在

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

我很想知道为什么要添加 40

这是一些安全边际吗?或者微软试图告诉我们一些关于StringCchPrintf的事情?或其他什么?

1 个答案:

答案 0 :(得分:4)

给定格式字符串%s failed with error %d: %s,有21个字符的文本(" failed with error "": ")。错误代码的最长表示形式(0x8FFFFFFF或十进制的-1879048193)长度为11个字符。为null终止符取另一个字符,总共有33个字符,加上两个输入字符串的长度。因此代码过度分配了7个字符的空间。

这可能意味着作者匆忙,估计所需的缓冲区大小,稍微高估它以防万一,或者技术作者修复错误文本而不在代码中考虑它。

我们真的不知道,但是如果您使用的是Visual Studio并且不想自己做数学计算,那么您可以让CRT通过调用{{3}中的任何一个来为您完成这项工作。函数族。这不仅不受格式字符串变化的影响,而且还记录了作者的意图,没有任何问题没有答案。