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

时间:2015-02-05 19:26:38

标签: c overflow

#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”,那么它将导致段错误。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

缓冲区溢出,并不意味着它总是会出现分段错误。它是未定义的行为 - 可能存在段错误。这取决于&#34;放置&#34;紧跟在内存中的变量之后。

答案 2 :(得分:0)

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