为什么要将 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 为您计算=] 函数族。这不仅不受格式字符串变化的影响,而且还记录了作者的意图,没有任何问题未得到解答。
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 为您计算=] 函数族。这不仅不受格式字符串变化的影响,而且还记录了作者的意图,没有任何问题未得到解答。