-1

在下面的代码中,

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

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

输入示例:

hello

输出:

1819043176

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

4

1 回答 1

5

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

如果int大小不同,或者机器使用另一个字符集(如 EBCDIC 而不是 ASCII),或者 CPU 使用大端字节序,或者如果程序在内存写入受边界检查的环境中运行,你会得到不同的结果或程序崩溃。简而言之,未定义的行为。

于 2013-07-21T08:53:55.737 回答