Ошибка, что стек был поврежден при использовании strcat_s - PullRequest
1 голос
/ 12 апреля 2020

Я изучал strcat_s и написал на практике следующий код:

int main(void)
{
    char szPath[128] = { "C:\\Program Files\\" };

    strcat_s(szPath + strlen("C:\\Program Files\\"), sizeof(szPath), "CHS\\");
    strcat_s(szPath + strlen("C:\\Program Files\\CHS\\"), sizeof(szPath), "C programming");
    puts(szPath);
    return 0;
}

Вывод работал правильно, как C:\Program Files\CHS\C programming

, но всплыло окно с ошибкой отладки,

Stack around the variable 'szPath' was corrupted. В чем причина?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Если вы отправите szPath + strlen("C:\\Program Files\\") в качестве параметра, тогда размер строки будет sizeof(szPath) - strlen("C:\\Program Files\\").

То же самое для второй строки - размер sizeof(szPath) - strlen("C:\\Program Files\\CHS\\").

Размер строки 128, но вы отправляете указатель на середину, где количество доступных символов меньше.

0 голосов
/ 12 апреля 2020

Похоже, что отладочная версия strcat_s в Visual Studio преднамеренно перезаписывает всю длину буфера: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcat-s-wcscat-s-mbscat-s?view=vs-2019

Сначала отладочные версии этих функций в библиотеке заполнить буфер 0xFE. Чтобы отключить это поведение, используйте _CrtSetDebugFillThreshold.

Это означает, что если вы задаете слишком большое значение размера, среда отладки должна обнаружить это, повредив стек.

В вашем случае вы не передаете указатель на начало буфера, поэтому ваш размер на strlen байт больше, чем доступное пространство. Самое простое решение - просто передать неизмененный указатель на strcat_s, он выполняет внутреннее strlen, чтобы найти текущий конец строки:

int main(void)
{
    char szPath[128] = { "C:\\Program Files\\" };

    strcat_s(szPath, sizeof(szPath), "CHS\\");
    strcat_s(szPath, sizeof(szPath), "C programming");
    puts(szPath);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...