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