C指针问题,解除引用崩溃

时间:2010-05-23 22:05:20

标签: c pointers

为什么这样做?

    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);

做C的复习课程,很高兴我做到了。

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

4 个答案:

答案 0 :(得分:3)

我不确定“作品”是什么意思,但第一个是错误的,因为你在第一个例子中将var指向并将其与零进行比较,并且因为var已初始化为用户的内容输入,var指向的内容不太可能是有效的地方。

*var != 0

这将获取用户定义的var指向的值。

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

当你因各种原因做未定义的事情时,事情似乎有效或失败。您应该理解为什么您编写的代码是正确的,而不是放下一些代码,并将其更改直到它工作。

答案 1 :(得分:0)

您将int *传递给sscanf,而不是int **。从第一个声明中删除*或将其初始化为类似malloc(sizeof(int))并删除&来自sscanf电话。

答案 2 :(得分:0)

在这两种情况下,您都会将scanf()的地址int传递给格式字符串,使其预期int本身。 所以我说他们都会调用未定义的行为 。第一个崩溃而第二个崩溃只是其中一个可以表现出来的方式之一。除了你不看或满月之外,它可能也是反过来,或者两者都崩溃,或者没有,或者没有。未定义的行为可以完成所有这些以及更多。

答案 3 :(得分: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)