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

标签 c winapi buffer allocation

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/

相关文章:

c - 如何在字符串前添加减号? (在 C 中)

c - 进入 NIT 参数编号 9 时有非法值

c++ - 如何使用 visual studio c 在 win32 中拉伸(stretch)背景图像

windows - 在 x64 64 位 Windows 上使用 NASM(和 GoLink)的 Hello World

c++ - MFC:动态 CEdit ctrl 没有应用与非动态 CEdit ctrl 相同的视觉样式

video - 将帧插入 FFmpeg 缓冲区

将十进制数转换为十六进制是以相反顺序打印的吗?

C - fread() 到缓冲区索引

c - scanf/getchar 只有第一次通过循环才能正常工作吗?

c - 如果删除链表的最后一个节点,程序将崩溃