_snwprintf_s ошибка повреждения кучи в вызове free () - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь использовать _snwprintf_s для объединения двух строк. Я также хочу добавлять \ r \ n после каждой строки.

Поэтому я изначально выделяю буфер wchar, включающий \ r \ n и ноль для обеих строк. Я пытаюсь напечатать одну за другой.

Я вижу, что обе строки написаны. Но при попытке освобождения (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");       

}

1 Ответ

2 голосов
/ 10 апреля 2020

_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)));
...