scanf对于short int的奇怪行为

tel*_*oon 2 c scanf undefined-behavior

代码如下:

#include <stdio.h>
main()
{
    int m=123;
    int n = 1234;
    short int a;
    a=~0;
    if((a>>5)!=a){
        printf("Logical Shift\n");
        m=0;
    }
    else{
        printf("Arithmetic Shift\n");
        m=1;
    }
    scanf("%d",&a);
    printf("%d\n", m);
}
Run Code Online (Sandbox Code Playgroud)

在该行之后scanf("%d",&a);,m的值变为0.

我知道它可能是由scanf引起的:a的类型很短,输入的类型是int.但这怎么会影响m的价值呢?

非常感谢 !

Fil*_*efp 7

对于最可能的原因m0在你的代码片段,因为分配m给在你的if语句的身体这个值,但由于代码中包含未定义行为没有人可以说是肯定的.


关于传递一个short*什么时候scanf 的可能性的故事int*

假设sizeof(short) = 2sizeof(int) == 4.

输入主函数时,变量所在的堆栈通常如下所示:

  _
 |short int (a)   : scanf will try to read an int (4 bytes).
 |_ 2 bytes       : This part of memory will most
 |int       (n)   : likely be overwritten
 |                :..
 |
 |_ 4 bytes
 |int       (m)
 |
 |
 |_ 4 bytes
Run Code Online (Sandbox Code Playgroud)

当你将一个%d(即一个int)读入a不应该影响变量的变量时m,尽管n很可能会覆盖它的一部分.


未定义的行为

虽然这是一个猜谜游戏,因为你在使用scanf语句时调用我们通常所说的" 未定义行为 ".

标准不保证的一切都是UB,结果可能是任何东西.也许您会将数据写入另一个属于不同变量的段,或者您可能会使Universe内爆.

当UB出现时,没有人能保证我们能活着看到另一天.


如何阅读short int使用scanf

使用%hd,并确保通过它short*...我们已经有足够的UB一晚!