C - 将字符串输入int变量?

Shi*_*ale -1 c int scanf

在以下代码中,

#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)

这是什么数字,到底发生了什么?

Jon*_*oni 5

该程序将从用户读取的字符串写入变量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时,它被解释为数字0x6c6c65681819043176十进制.

如果int是不同的大小,如果机器使用另一个字符集(如EBCDIC而不是ASCII),或者如果CPU使用big-endian字节顺序,或者如果该程序的环境中运行,其中内存写入绑定核对,你会得到不同的结果或程序崩溃.简而言之,未定义的行为.