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