1

我正在学习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. 原因是什么?

4

2 回答 2

1

如果您szPath + strlen("C:\\Program Files\\")作为参数发送,则字符串的大小为sizeof(szPath) - strlen("C:\\Program Files\\").

第二行相同 - 大小为sizeof(szPath) - strlen("C:\\Program Files\\CHS\\").

字符串大小为 128,但您将指针发送到中间,可用字符数较少。

于 2020-04-12T10:00:09.270 回答
0

看起来strcat_sVisual Studio 中的调试版本故意覆盖了缓冲区的全长: https ://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcat-s-wcscat-s- mbscat-s?view=vs-2019

这些函数的调试库版本首先用 0xFE 填充缓冲区。要禁用此行为,请使用 _CrtSetDebugFillThreshold。

这意味着如果您提供的 size 值太大,调试运行时应该通过破坏堆栈来检测到这一点。

在您的情况下,您没有传递指向缓冲区开头的指针,因此您的大小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;
}
于 2020-04-12T10:15:50.463 回答