2015-02-05 62 views
-1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

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

运行时,它打印:当strcpy()导致缓冲区溢出时为什么没有分段错误?

aaaaaaaaaaaaaaaa 

如果我做*超长,例如,* A = “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,那么就会造成一个段错误。

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

+2

未定义的行为。该程序在您的浴室中产生一头大象完全有效。 – EOF 2015-02-05 19:29:28

+0

C语言中没有“分段错误”这样的事情。你可以做任何事情,包括跨越其他记忆。当你做这些事时会发生什么,这就是我们不知道的 - 也许程序会崩溃,也许它会“起作用”,也许它在一台机器上工作,并在另一台机器上崩溃等等。这就是所谓的“未定义行为'。 – PaulMcKenzie 2015-02-05 19:35:43

+0

这是一个多重复制,但不能找到一个副本。 – 2015-02-05 19:49:58

回答

2

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

0

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

0

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