我去接受采访时被问到以下问题:
您如何看待以下内容?
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/