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


  您如何看待以下内容?

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



我回答了:


该程序将成功编译。
它将打印错误的数字,但是它将一直运行到最后
没有崩溃


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

之后,他们解雇了我:


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


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

最佳答案

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

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


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

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

scanf("%d", &i);


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

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

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

关于c - 如果未在“scanf”语句中添加“&”,将会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52213351/

10-10 03:03