如果'&'会发生什么?在接受输入时,运算符不包含在scanf中?

时间:2017-06-05 18:49:15

标签: c

我想问一个问题,如果'&'运算符不包含在scanf中。

 #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;
  } 

程序崩溃或打印出一些垃圾值。我有点困惑。

2 个答案:

答案 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 中存储的地址。这有几个问题:

  1. x未明确初始化为任何内容;它的值是不确定;
  2. 由于1,x包含与有效指针值对应的值(即程序中对象的位置)的几率非常低; < / LI>
  3. 表达式x的类型是x,但int期望其对应的参数具有类型%d - 任何现代编译器都应该对你大喊大叫。