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

Why is 40 added to the size passed to LocalAlloc?

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 的事情?还是别的?

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

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

我们真的不知道,但是如果您正在使用 Visual Studio 并且不想自己计算,您可以通过调用 [=14] 中的任何一个让 CRT 为您计算=] 函数族。这不仅不受格式字符串变化的影响,而且还记录了作者的意图,没有任何问题未得到解答。