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

时间:2013-07-21 08:35:41

标签: c int scanf

在以下代码中,

#include <stdio.h>
int main()
{
    int i = 5;
    scanf("%s", &i);
    printf("%d\n", i);
    return 0;
}

我接受存储在i地址的输入字符串。当我尝试打印变量i时,我会得到一些数字。

输入示例:

hello

输出:

1819043176

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

1 个答案:

答案 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字节顺序,或者程序在内存环境中运行写入绑定检查,您将得到不同的结果或程序崩溃。简而言之,未定义的行为。