为什么这样做?
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)用于指针。但完全忘记了记忆,谢谢!
答案 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)