繁体   English   中英

C指针问题,取消引用崩溃

[英]C pointer question, dereferencing crash

为什么要这样做?

    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)用于指针。 但是完全忘记了记忆,谢谢!

我不确定“工作”是什么意思,但是第一个是错误的,因为在第一个示例中您将var指向什么并将其与零进行比较,并且由于var已初始化为用户输入的内容,因此var指向的可能性不大。

*var != 0

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

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

当您出于各种原因执行未定义的事情时,事情似乎会工作或失败。 您应该了解您正在编写的代码为什么正确,而不是放下一些代码并对其进行更改直到可用为止。

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

在这两种情况下,您都要传递scanf()一个int的地址,其中格式字符串使它期望一个int本身。
所以我想说它们都调用未定义的行为 第一个崩溃而不是第二个崩溃只是它可以体现的多种方式之一。 除非您不看或满月,否则它也可能是相反的,或者两者都崩溃了,或者没有崩溃,或者没有崩溃。 未定义的行为会做更多的事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM