以下代码运行时会发生什么?
What happens when the following code runs?
#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”
您的代码的行为是未定义的,这意味着它可能有不同的结果,具体取决于您使用的编译器以及您运行生成的可执行文件所在的机器。
产生您所观察到的结果的一种可能性是,编译器将 a
和 b
存储在堆栈中,为每个分配 space 以恰好保存一个 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 上,堆栈向下增长(从高地址到低地址),所以这很可能就是您所观察到的。
但请记住,您不应依赖此行为,因为不能保证它在所有情况下都以相同的方式工作。
#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”
您的代码的行为是未定义的,这意味着它可能有不同的结果,具体取决于您使用的编译器以及您运行生成的可执行文件所在的机器。
产生您所观察到的结果的一种可能性是,编译器将 a
和 b
存储在堆栈中,为每个分配 space 以恰好保存一个 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 上,堆栈向下增长(从高地址到低地址),所以这很可能就是您所观察到的。
但请记住,您不应依赖此行为,因为不能保证它在所有情况下都以相同的方式工作。