是什么导致了我的方法中的堆损坏?

What causes the heap corruption in my method?

所以我已经追踪到一个恼人的堆损坏是一个方法。

DWORD gdwCounter = 0;

TCHAR* GetName(const TCHAR* format, size_t len)
{
    len += (snprintf(NULL, 0, "%lu", gdwCounter) * sizeof(TCHAR));
    TCHAR *c = (TCHAR*)malloc(len);
    _stprintf_s(c, len, __TEXT("%s%lu"), format, gdwCounter);
    return c;
}

为了确保我找到了正确的方法,我尝试更改它并复制它作为参数传递给输出缓冲区的 'format' 缓冲区。堆损坏消失了,一切都恢复正常了。

我决定查看 snprintf and _stprintf_s 的文档。

snprintf 应该 return 没有空终止字符的所需字符,以便在第二次调用时实际打印缓冲区。

我的 len 参数已经包含 format.

的完整大小(带有空终止字符)

此外,我在 _stprintf_s.

的文档中找不到任何错误提示

所以我错过了什么?

编辑:经过进一步测试,我发现显然 _stprintf_s 会导致错误,因为 snprintf 会 return 正确的大小。

TCHAR* GetName(const TCHAR* format, size_t len)
{
    len += snprintf(NULL, 0, "%lu", gdwCounter);
    TCHAR *c = (TCHAR*)malloc(len*sizeof(TCHAR));
    _stprintf_s(c, len, __TEXT("%s%lu"), format, gdwCounter);
    return c;
}

_stprintf_s 采用“要存储的最大字符数”而不是最大字节数。