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的价值呢?
非常感谢 !
对于最可能的原因m是0在你的代码片段,因为分配m给在你的if语句的身体这个值,但由于代码中包含未定义行为没有人可以说是肯定的.
short*什么时候scanf 的可能性的故事int*假设sizeof(short) = 2和sizeof(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一晚!
| 归档时间: |
|
| 查看次数: |
6119 次 |
| 最近记录: |