2011-03-04 111 views
1

以下代码段的输出应该是什么?为什么?这段代码段的输出结果是什么?为什么?

 #include <stdio.h> 
    #include <string.h> 
    int main() 
    { 
     char ch = 'A'; 
     char str[3]; 
     strcpy(str, "ABCDE"); 
     printf("%c", ch); 
     } 
+5

[鼻恶魔](http://www.catb.org/jargon/html/N/nasal-demons.html),当然。 – dmckee 2011-03-04 05:06:23

+0

这是以前几个问题的重复,但找​​到它们可能会很棘手。 – dmckee 2011-03-04 05:08:46

+0

谁写了这段代码片段,为什么? – Blastfurnace 2011-03-04 06:03:49

回答

8

这个程序的输出可以是任何东西,因为你缓冲区溢出str,并得到了一个未定义的行为。事实上,该程序可能不会输出任何内容,可能会崩溃,或者可能会做得更糟。

1

该片段调用未定义的行为。结果可以是任何事情,从崩溃到意外输出。

1

正如其他人所提到的,这是未定义的行为,因为它取决于分配给str的任何位置的内存的内容。它将从ABCDE开始,但会随机转换为转换为字符或崩溃的随机字节集合。

0

输出未定义。在Linux中,我得到输出D,因为我认为从下到上存储在堆栈中的数据。所以ch存储在底部,str存储在它的上面。现在你用另外两个字节覆盖str,这会导致ch变量被破坏,这可能导致显示D作为输出。同样,这取决于您正在运行的编译器和操作系统。