[英]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.