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
的事情?或其他什么?
答案 0 :(得分:4)
给定格式字符串%s failed with error %d: %s
,有21个字符的文本(" failed with error "
和": "
)。错误代码的最长表示形式(0x8FFFFFFF或十进制的-1879048193)长度为11个字符。为null终止符取另一个字符,总共有33个字符,加上两个输入字符串的长度。因此代码过度分配了7个字符的空间。
这可能意味着作者匆忙,估计所需的缓冲区大小,稍微高估它以防万一,或者技术作者修复错误文本而不在代码中考虑它。
我们真的不知道,但是如果您使用的是Visual Studio并且不想自己做数学计算,那么您可以让CRT通过调用{{3}中的任何一个来为您完成这项工作。函数族。这不仅不受格式字符串变化的影响,而且还记录了作者的意图,没有任何问题没有答案。