在以下代码中,
#include <stdio.h>
int main()
{
int i = 5;
scanf("%s", &i);
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我取输入字符串存储在地址i.当我尝试打印变量时i,我得到一些数字.
输入示例:
hello
Run Code Online (Sandbox Code Playgroud)
输出:
1819043176
Run Code Online (Sandbox Code Playgroud)
这是什么数字,到底发生了什么?
该程序将从用户读取的字符串写入变量i占用的内存中并将其过去.由于这是未定义的行为,任何事情都可能发生.
什么是实际发生的情况是,在你的机器int是4个大小charS和字符"地狱",当转换成ASCII码,并解释为在CPU中的字节顺序号码,原来是数1819043176.的其余部分字符串,字母o和终止的nul字符超过了我在机器上存储的位置.那是什么呢scanf:
h e l l o \0
|68 65 6c 6c|6f 00 ...
| i|memory past i
Run Code Online (Sandbox Code Playgroud)
你似乎是在一个小端机器上运行它,所以当字节68 65 6c 6c存储到一个int时,它被解释为数字0x6c6c6568或1819043176十进制.
如果int是不同的大小,如果机器使用另一个字符集(如EBCDIC而不是ASCII),或者如果CPU使用big-endian字节顺序,或者如果该程序的环境中运行,其中内存写入绑定核对,你会得到不同的结果或程序崩溃.简而言之,未定义的行为.