scanf传递指针地址的行为(地址变量)

时间:2016-03-06 13:05:18

标签: c scanf

我知道这是使用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()的事情可以解释为什么这两个代码(几乎相同)的工作方式不同吗?

1 个答案:

答案 0 :(得分:0)

通常,类型为 func removeADs() { let product = storeProducts.first Purchasables.store.purchaseProduct(product!) } 的数据作为变量长度参数传递,如@zch所述,被提升为float,而double期望它。

在这种情况下,传递的内容是printf(),它不会神奇地成为float*

这就是double获取错误数据的原因 - 数据和大小都是错误的。