我知道这是使用scanf()的错误方法。但我希望C专家回答这个问题:
#include <stdio.h>
int main(int argc, char *argv[])
{
int *a;
printf("please input one number:\n");
scanf("%d", &a);
printf("your input is %d\n", a);
return 0;
}
输出:
please input one number:
30
your input is 30
由于* a已存在,因此在执行时不会带来 段错误 。 和scanf()神奇地将正确的数据填充到* a,make(int *)into(int);然后printf()将正确输出。
我认为这段代码可以工作,因为sizeof(int *)和sizeof(int)在我的系统上是相同的值。所以我也在我的系统上检查一些类型大小:
sizeof(short) return 2
sizeof(short*) return 4
sizeof(int) return 4
sizeof(int*) return 4
sizeof(long) return 4
sizeof(long*) return 4
sizeof(float) return 4
sizeof(float*) return 4
sizeof(double) return 8
sizeof(double*) return 4
sizeof(char) return 1
sizeof(char*) return 4
看起来这个代码在浮动时也可以工作,但它并没有。我尝试的代码在这里:
#include <stdio.h>
int main(int argc, char *argv[])
{
float *a;
printf("please input one number:\n");
scanf("%f", &a);
printf("your input is %f\n", a);
return 0;
}
输出:
please input one number:
3.5
your input is -0.034267
scanf()应该可以工作,因为我在调用scanf()时使用%f。因为我仍然给它一个4字节的内存地址。
我无法弄明白。有人知道整个scanf()的事情可以解释为什么这两个代码(几乎相同)的工作方式不同吗?
答案 0 :(得分:0)
通常,类型为 func removeADs() {
let product = storeProducts.first
Purchasables.store.purchaseProduct(product!)
}
的数据作为变量长度参数传递,如@zch所述,被提升为float
,而double
期望它。
在这种情况下,传递的内容是printf()
,它不会神奇地成为float*
。
这就是double
获取错误数据的原因 - 数据和大小都是错误的。