在下面的代码中,
#include <stdio.h>
int main()
{
int i = 5;
scanf("%s", &i);
printf("%d\n", i);
return 0;
}
我采用存储在地址的输入字符串i
。当我尝试打印变量i
时,我得到了一些数字。
输入示例:
hello
输出:
1819043176
这是什么数字,到底发生了什么?
该程序将从用户那里读取的字符串写入变量 i 占用的内存中并传递过去。由于这是未定义的行为,任何事情都可能发生。
实际发生的情况是,您的机器int
上的大小为 4char
秒,而字符“hell”在转换为 ASCII 并解释为 CPU 字节顺序中的数字时,结果是数字 1819043176。其余的字符串、字母 o 和终止的 nul 字符超出了 i 存储在您机器上的位置的末尾。那么这scanf
是做什么的:
h e l l o \0
|68 65 6c 6c|6f 00 ...
| i|memory past i
您似乎在小端机器上运行它,因此当字节68 65 6c 6c
存储到 int 时,它被解释为 number0x6c6c6568
或1819043176
十进制。
如果int
大小不同,或者机器使用另一个字符集(如 EBCDIC 而不是 ASCII),或者 CPU 使用大端字节序,或者如果程序在内存写入受边界检查的环境中运行,你会得到不同的结果或程序崩溃。简而言之,未定义的行为。