为什么strcpy()导致缓冲区溢出时没有分段错误?

#include  #include  #include  void main() { char *a = "aaaaaaaaaaaaaaaa"; char b[1]; strcpy(b, a); printf("%s\n", b); } 

运行时,它会打印:

 aaaaaaaaaaaaaaaa 

如果我做一个超长的,例如,* a =“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,那么它将导致段错误。

为什么第一种情况没有溢出?

当程序试图访问不属于程序虚拟地址空间的内存时,会发生分段错误; 如果您只是在原始复制目标之后覆盖一些内容,则不会发生这种情况。

缓冲区溢出,并不意味着它总是会出现分段错误。 它是未定义的行为 – 可能存在段错误。 它取决于你的变量在内存中的“放置”。

看似工作,或者就此而言,不会崩溃,是一种有效的未定义行为forms。 当您的程序具有UB时, 任何事情都可能发生。 这就是为什么它非常不受欢迎。