为了账号安全,请及时绑定邮箱和手机立即绑定

如果未在“ scanf”语句中放入“&”,将会发生什么?

/ 猿问

如果未在“ scanf”语句中放入“&”,将会发生什么?

C
米琪卡哇伊 2019-11-19 15:05:57

我去接受采访时被问到以下问题:


您如何看待以下内容?


int i;

scanf ("%d", i);

printf ("i: %d\n", i);

我回答了:


该程序将成功编译。

它将打印错误的数字,但是它将一直运行到最后而不会崩溃

我的回答是错误的。我不知所措。


之后,他们解雇了我:


在某些情况下,该程序将崩溃并导致核心转储。


我不明白为什么程序会崩溃?谁能解释我的原因?任何帮助表示赞赏。


查看完整描述

3 回答

?
手掌心

定义变量后,编译器会为该变量分配内存。


int i;  // The compiler will allocate sizeof(int) bytes for i

i 上面定义的未初始化,并且具有不确定的值。


要将数据写入分配给的内存位置i,您需要指定变量的地址。该声明


scanf("%d", &i);

用户会将int数据写入为分配的内存位置i。


如果&未放置在前面i,scanf则将尝试将输入数据i而不是写入存储位置&i。由于i包含不确定的值,因此有可能包含与存储地址相同的值,或者包含超出存储地址范围的值。


在这两种情况下,程序都可能会出现异常行为,并导致未定义的行为。在这种情况下,可能会发生任何事情。


查看完整回答
反对 回复 2019-11-19
?
眼眸繁星

因为它会调用未定义的行为。该scanf()系列函数期望一个指向整数时,"%d"符中找到。您正在传递一个整数,该整数可以解释为某个整数的地址,但不是。这在标准中没有定义的行为。它确实可以编译(但是会发出警告),但是肯定会以意外的方式工作。

就目前的代码而言,还有另一个问题。该i变量从不初始化,因此它将具有不确定的值,这也是Undefined Behavior的另一个原因。

请注意,该标准并没有说明当您期望给定其他类型时传递给定类型时会发生什么,无论您交换哪种类型,它只是未定义的行为。但是这种特殊情况需要特别考虑,因为可以将指针转换为整数,尽管只有在转换回指针并且整数类型能够正确存储值的情况下才定义行为。这就是为什么它可以编译,但是肯定不能正常工作。


查看完整回答
反对 回复 2019-11-19
?
喵喵时光机

您将类型错误的数据(应该int*是,但是int传递了)传递给scanf()。这将导致不确定的行为

未定义的行为可能会发生任何事情。该程序可能会崩溃,也可能不会崩溃。

在典型的环境中,我猜想将指向操作系统不允许写入的位置的“地址”传递给时scanf(),程序会崩溃,并且写入该指令将使OS终止应用程序,它将被视为崩溃。


查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信