当以下代码运行时会发生什么?

时间:2020-10-24 16:36:03

标签: c scanf

#include <stdio.h>
int main(void) {
    char a, b, c;
    scanf("%2c%2c",&a, &b);
    printf("%c%c",a, b);
    return 0;
}

当我输入“ asdfghj”时,它将输出“ fd”,而不是“ ad”

1 个答案:

答案 0 :(得分:1)

代码的行为是不确定的,这意味着根据使用的编译器和在其上运行生成的可执行文件的机器,代码可能会有不同的结果。

可能会产生您观察到的结果的一种可能性是,编译器将ab存储在堆栈上,为每个分配空间以恰好容纳一个char。这样会导致这样的布局(假设char是一个字节):

==========================================================================
| Memory Address | Variable | Value after   | Value after   | End result |
| (byte)         |          | assignment to | assignment to |            |
|                |          | `a`           | `b`           |            |
==========================================================================
| 128            |          | s             | s             | s          |
| 127            | a        | a             | f             | f          |
| 126            | b        | ?             | d             | d          |
--------------------------------------------------------------------------

在x86上,堆栈向下增长(从高地址到低地址),因此这很可能就是您所观察的。

但是请记住,您不应该依赖此行为,因为不能保证在所有情况下都能以相同的方式工作。