#include <stdio.h>
int main()
{
int x;
scanf("%d", x);
/* than what type of value will scanf store in x if there is
not address of operator. */
printf("%d", x);
return 0;
}
程序崩溃或打印出一些垃圾值。我有点困惑。
答案 0 :(得分:2)
scanf会尝试将其读取的值写入 x中存储的地址。当你使用&amp;运算符,它会将值写入地址 x。
在这种情况下,x是堆栈上的变量。堆栈上的变量(在C中)不会自动初始化,因此最初x可能包含垃圾值。因此,scanf会尝试将输入值写入内存中的垃圾地址。
如果x中的值指向,则可能导致程序代码或数据损坏(可能导致程序崩溃或导致意外行为),或导致分段错误(这将导致操作系统中止程序)不允许程序写入的内存(无效或只读内存)。究竟会发生什么取决于x的值,它可能是另一个程序遗留的值,每次运行程序时这可能会有所不同。
答案 1 :(得分:0)
当您使用scanf
转换说明符调用%d
时,相应的参数必须是一个表达式,该表达式求值为{{1}的整数对象的位置将写入输入值:
scanf
scanf( "%d", location-expression );
可以采用多种形式。要读入location-expression
这样的单个标量对象,可以使用表达式x
。
&x
或者,您可以使用已初始化的指针变量指向scanf( "%d", &x ); // &x evaluates to the location of x
:
x
在这种情况下,表达式 int *p = &x; // p stores the address of x
scanf( "%d", p ); // scanf writes to x *through* p; p == &x
等同于表达式p
。我们不会在&x
上使用&
运算符,因为我们希望在p
中写入存储的地址,而不是地址 p
。
写作时
p
您告诉scanf( "%d", x );
将输入存储到scanf
中存储的地址。这有几个问题:
x
未明确初始化为任何内容;它的值是不确定; x
包含与有效指针值对应的值(即程序中对象的位置)的几率非常低; < / LI>
x
的类型是x
,但int
期望其对应的参数具有类型%d
- 任何现代编译器都应该对你大喊大叫。