Retrieving the Last-Error Code 的示例代码在 MSDN 上显示此代码:
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 个字符的空间。
这可能意味着作者很匆忙,估计了所需的缓冲区大小,稍微高估了以防万一,或者技术作家修复了错误文本而没有在代码中考虑它。
我们真的不知道,但如果您使用的是 Visual Studio 并且不想自己做数学运算,您可以通过调用 _vsctprintf
中的任何一个让 CRT 为您做这件事。函数族。这不仅不受格式字符串更改的影响,而且还记录了作者的意图,没有任何问题未得到解答。
关于c - 为什么要将 40 添加到传递给 LocalAlloc 的大小中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611412/