c-使用strcat_s时堆栈损坏的错误



我在学习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 FilesCHSC programming

但是弹出了一个调试错误窗口,

Stack around the variable 'szPath' was corrupted.原因是什么?

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

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

字符串大小为128,但您发送一个指向中间的指针,其中可用字符数较小。

visual studio中strcat_s的调试版本似乎故意覆盖了缓冲区的整个长度:https://learn.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;
}

最新更新