2010-05-23 194 views
1

为什么这个工作?C指针问题,解引用崩溃

int *var; 

while(scanf("%d", &var) && *var != 0) 
     printf("%d \n", var); 

虽然这不?

int *var; 

while(scanf("%d", &var) && var != 0) 
    printf("%d \n", var); 

*(取消引用操作符)不会给你指针指向的值吗?那么为什么 * var!= 0会使程序崩溃,而var!= 0不会呢?


这工作:

int* var = malloc(sizeof(int)); 

while(scanf("%d", var) && *var != 0) 
    printf("%d \n", *var); 

上做下的进修课程,很高兴我做到了。

我意识到scanf(& var)是用于常规变量,而scanf(var)用于指针。但完全忘记了内存,谢谢!

+1

当您向程序中输入数据时,您如何知道您输入的是有效地址? – WhirlWind 2010-05-23 22:18:13

+0

有效的地址?我输入一个整数,我不是吗? – jn1kk 2010-05-24 01:27:32

回答

0

您将一个int *传递给sscanf,而不是int **。从第一个声明中删除*或将它初始化为像malloc(sizeof(int))之类的东西,并从sscanf调用中删除&。

3

我不确定你的意思是“作品”,但第一个是错误的,因为你正在采取什么样的var指向并在第一个例子中将它比作零,并且因为var已经初始化为什么用户输入,什么var指向不可能是一个有效的地方。

*var != 0 

这需要由用户定义的var指向的值。

请注意,在scanf中,您正在将整数扫描为int **,而不是int *,而printf使用%d打印指针而不是整数。

当你因各种原因做未定义的事情时,事物可能似乎工作或失败。你应该明白为什么你写的代码是正确的,而不是放下一些代码,并改变它直到它工作。

+1

这并不是var没有被初始化,而是它被初始化为用户输入的数字,所以它不可能指向有效的内存地址。 – sepp2k 2010-05-23 22:12:15

+0

sepp2k我的错误 - 已更新。 – WhirlWind 2010-05-23 22:14:16

0

在这两种情况下,您都通过scanf()int的地址,其中格式字符串使其期望int本身。
所以我会说他们都援引未定义的行为。第一个崩溃而第二个崩溃只是其中许多方式之一。它也可能是相反的,或者两者都崩溃,或者没有,或者没有,除非你没有看,或者没有满月。未定义的行为可以完成所有这些工作。

0
(1) int i; // reserves an integer 
(2) scanf("%d",&i); // writes to the address of i 
(3) int *var; // is a pointer pointing to some unpredictable place 
(4) int *var = &i; // would point exactly to the adress of i 
(5) scanf("%d",var) // would be the same as (2)