#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char *a = "aaaaaaaaaaaaaaaa";
char b[1];
strcpy(b, a);
printf("%s\n", b);
}
运行时,会打印:
aaaaaaaaaaaaaaaa
如果我制作一个超长的,例如* a =“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,那么它将导致段错误。
为什么第一种情况没有溢出?
答案 0 :(得分:2)
当程序试图访问不属于程序虚拟地址空间的内存时,会发生分段错误;如果您只是在原始复制目的地之后覆盖一些东西,就不会发生这种情况。
答案 1 :(得分:0)
缓冲区溢出,并不意味着它总是会出现分段错误。它是未定义的行为 - 可能存在段错误。这取决于&#34;放置&#34;紧跟在内存中的变量之后。
答案 2 :(得分:0)
似乎工作,或者就此而言,不会崩溃,是一种有效的未定义行为形式。当您的程序具有UB时,任何都可能发生。这就是为什么它非常不受欢迎。