3 回答
TA贡献1942条经验 获得超3个赞
定义变量后,编译器会为该变量分配内存。
int i; // The compiler will allocate sizeof(int) bytes for i
i 上面定义的未初始化,并且具有不确定的值。
要将数据写入分配给的内存位置i,您需要指定变量的地址。该声明
scanf("%d", &i);
用户会将int数据写入为分配的内存位置i。
如果&未放置在前面i,scanf则将尝试将输入数据i而不是写入存储位置&i。由于i包含不确定的值,因此有可能包含与存储地址相同的值,或者包含超出存储地址范围的值。
在这两种情况下,程序都可能会出现异常行为,并导致未定义的行为。在这种情况下,可能会发生任何事情。
TA贡献1873条经验 获得超9个赞
因为它会调用未定义的行为。该scanf()
系列函数期望一个指向整数时,"%d"
符中找到。您正在传递一个整数,该整数可以解释为某个整数的地址,但不是。这在标准中没有定义的行为。它确实可以编译(但是会发出警告),但是肯定会以意外的方式工作。
就目前的代码而言,还有另一个问题。该i
变量从不初始化,因此它将具有不确定的值,这也是Undefined Behavior的另一个原因。
请注意,该标准并没有说明当您期望给定其他类型时传递给定类型时会发生什么,无论您交换哪种类型,它只是未定义的行为。但是这种特殊情况需要特别考虑,因为可以将指针转换为整数,尽管只有在转换回指针并且整数类型能够正确存储值的情况下才定义行为。这就是为什么它可以编译,但是肯定不能正常工作。
TA贡献1846条经验 获得超7个赞
您将类型错误的数据(应该int*
是,但是int
传递了)传递给scanf()
。这将导致不确定的行为。
未定义的行为可能会发生任何事情。该程序可能会崩溃,也可能不会崩溃。
在典型的环境中,我猜想将指向操作系统不允许写入的位置的“地址”传递给时scanf()
,程序会崩溃,并且写入该指令将使OS终止应用程序,它将被视为崩溃。
- 3 回答
- 0 关注
- 568 浏览
添加回答
举报