考虑下一个测试程序:
char a[10];
strcpy(a, "test");
for(int i=0; i<3; i++) {
char b[2];
strcpy(b, "tt");
strcat(a, b);
}
printf("%d %d %s\n", strlen(a), sizeof(a), a);
输出:10 10 testtttttt。 一切看起来都很好。
如果 i<7,则缓冲区溢出,但没有错误。输出:18 10 testtttttttttttttt。程序似乎正在运行。
如果 i<11,那么我们会看到错误“检测到堆栈粉碎”...
为什么程序在 i<7 时不提示错误?
最佳答案
你正在做的是未定义的行为。什么事情都可能发生。您所看到的只是一种可能的结果,某些自动工具很晚而不是立即检测到它。你的代码是错误的,任何假设应该发生的事情都是错误的,询问“为什么”是毫无意义的。使用不同的编译器,或使用不同的编译器设置,或在不同的日期,结果可能完全不同。
顺便说一句,当 i = 0 时,会发生缓冲区溢出,因为您试图将两个字符和尾随零字节复制到仅具有两个字符空间的缓冲区中。
关于仅当超出范围时 C 缓冲区才会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24777927/