[_ snwprintf_s free()调用中的堆损坏错误

问题描述 投票:0回答:1

我正在尝试使用_snwprintf_s连接两个字符串。我还想在每个字符串后附加\ r \ n。

因此,我为两个字符串分配了一个wchar缓冲区,最初包含\ r \ n和null。我尝试一个接一个地打印。

我看到两个字符串都被写入。但是,当尝试释放(wbuff)时,会抛出“堆损坏”错误。我无法弄清楚我越界的地方。

我要去哪里错了?让我知道。谢谢

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");       

}
c pointers winapi heap-corruption
1个回答
1
投票

_snwprintf_sfefe标记填充缓冲区中的其余字符。我在文档中找不到此内容,但可以在调试器中看到它。因此,您的第二个_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)));
© www.soinside.com 2019 - 2024. All rights reserved.