_snwprintf_s free() 调用中的堆损坏错误
_snwprintf_s heap corruption error in free() call
我正在尝试使用 _snwprintf_s 连接两个字符串。我还想在每个字符串后附加 \r\n。
所以我分配了一个 wchar 缓冲区,最初包括两个字符串的 \r\n 和 null。我尝试一个接一个打印。
我看到两个字符串都写好了。但是当尝试释放(wbuff)时,它会抛出一个 "Heap corruption" 错误。我不知道我在哪里越界了。
我哪里错了?让我知道。谢谢
int main()
{
WCHAR* name1 = L"HelloWorld";
WCHAR* name2 = L"GoodMorning";
WCHAR* wbuff = NULL;
int i = wcslen(name1) + wcslen(name2) + 6; //in words for size of buffer
int out = 0;
wbuff = (WCHAR*)malloc(i * sizeof(WCHAR));
ZeroMemory(wbuff, i * sizeof(WCHAR));
int prevLen = 0, currLen = 0;
currLen = wcslen(name1) + 2; //in bytes
out = _snwprintf_s(wbuff,i,currLen, L"%s\r\n", name1);
printf("Wrote %d characters\n", out);
prevLen = currLen;
currLen = wcslen(name2) + 2;
out = _snwprintf_s((wbuff+prevLen),i,currLen, L"%s\r\n", name2);
printf("Wrote %d characters\n", out);
printf("%S of sisze %u", wbuff, wcslen(wbuff));
free(wbuff);
printf("memory freed\n");
}
_snwprintf_s
用 fefe
标记填充缓冲区中的剩余字符。我在文档中找不到它,但我可以在调试器中看到它。因此,您的第二个 _snwprintf_s 表示它有 i
个字符可用,但您的起始位置是 prevLen
个字符。修复 i
以进行偏移调整。
而不是这个:
out = _snwprintf_s((wbuff+prevLen),i,currLen, L"%s\r\n", name2);
这个:
out = _snwprintf_s((wbuff+prevLen),i-prevLen,currLen, L"%s\r\n", name2);
_snwprintf_s
将用标记
填满整个缓冲区
而不是这个:
printf("%S of sisze %u", wbuff, wcslen(wbuff));
这个:
printf("%ls of sisze %u", wbuff, (unsigned int)(wcslen(wbuff)));
我正在尝试使用 _snwprintf_s 连接两个字符串。我还想在每个字符串后附加 \r\n。
所以我分配了一个 wchar 缓冲区,最初包括两个字符串的 \r\n 和 null。我尝试一个接一个打印。
我看到两个字符串都写好了。但是当尝试释放(wbuff)时,它会抛出一个 "Heap corruption" 错误。我不知道我在哪里越界了。
我哪里错了?让我知道。谢谢
int main()
{
WCHAR* name1 = L"HelloWorld";
WCHAR* name2 = L"GoodMorning";
WCHAR* wbuff = NULL;
int i = wcslen(name1) + wcslen(name2) + 6; //in words for size of buffer
int out = 0;
wbuff = (WCHAR*)malloc(i * sizeof(WCHAR));
ZeroMemory(wbuff, i * sizeof(WCHAR));
int prevLen = 0, currLen = 0;
currLen = wcslen(name1) + 2; //in bytes
out = _snwprintf_s(wbuff,i,currLen, L"%s\r\n", name1);
printf("Wrote %d characters\n", out);
prevLen = currLen;
currLen = wcslen(name2) + 2;
out = _snwprintf_s((wbuff+prevLen),i,currLen, L"%s\r\n", name2);
printf("Wrote %d characters\n", out);
printf("%S of sisze %u", wbuff, wcslen(wbuff));
free(wbuff);
printf("memory freed\n");
}
_snwprintf_s
用 fefe
标记填充缓冲区中的剩余字符。我在文档中找不到它,但我可以在调试器中看到它。因此,您的第二个 _snwprintf_s 表示它有 i
个字符可用,但您的起始位置是 prevLen
个字符。修复 i
以进行偏移调整。
而不是这个:
out = _snwprintf_s((wbuff+prevLen),i,currLen, L"%s\r\n", name2);
这个:
out = _snwprintf_s((wbuff+prevLen),i-prevLen,currLen, L"%s\r\n", name2);
_snwprintf_s
将用标记
而不是这个:
printf("%S of sisze %u", wbuff, wcslen(wbuff));
这个:
printf("%ls of sisze %u", wbuff, (unsigned int)(wcslen(wbuff)));