格式'%d'需要'int *'类型的参数,但参数的类型为'int'

时间:2016-09-27 00:12:43

标签: c

 if (answer == 'Y') {

    int a, u, l;
    printf("How many numbers do you need?\n");
    scanf("%d", a);

此行后该程序崩溃。我应该使用什么而不是“%d”?

    printf("Specify the lower bound of the range:");
    scanf("%d", l);

    printf("Specify the upper bound of the range:");
    scanf("%d", u);

    for(c = 1;c <= a ;c++) {
        n = rand() %(u - l) + 1;
        printf("%d\n", n);
    }

}

3 个答案:

答案 0 :(得分:3)

scanf("%d", &a);

scanf()需要一个可以存储信息的地址作为参数。

a是变量的名称,而&a是包含该变量的内存地址。

答案 1 :(得分:2)

您需要传递变量的地址,因为scanf()会将值存储在其中。

程序崩溃是因为scanf()正在取消引用int,它甚至尚未初始化,这两种情况都会导致未定义的行为。

事实上,所有这些都是未定义的行为,并且都发生在单个scanf()调用

  1. 取消引用无效指针
  2. 传递给定格式说明符的错误类型。
  3. 从未初始化的变量中读取。
  4. 要传递地址,请使用运算符的&地址

    if (scanf("%d", &a) == 1) {
        // Proceed with `a' and use it
    } else {
        // Bad input, do not use `a'
    }
    

    在这种情况下,警告不是错误,因为int原则上可转换为指针,但如果您尝试引用此类型,则行为未定义,并且指针大小可能太大int存储它。

    此警告非常严重,忽略它将永远不会导致良好的行为,因为它涉及处理一个不太可能像指针值一样的值,这通常会导致程序崩溃。

    一般情况下,如果您真的知道自己在做什么,则应该忽略警告。而且几乎从来没有,你会故意做一些触发警告的事情,尽管有些事情可能是合法的。

    作为初学者(我知道你是初学者只是因为你使用的是scanf() ),所以你不能忽视警告。

    此外,即使您的教科书示例永远不会检查您应该scanf()的返回值。不这样做,特别是当你没有初始化变量时,可能会调用未定义的行为。

答案 2 :(得分:0)

在scanf中传递变量的地址,如下所示:

 if (answer == 'Y') {
    int a, u, l;

    printf("How many numbers do you need?\n");
    scanf("%d", &a);

    printf("Specify the lower bound of the range:");
    scanf("%d", &l);

    printf("Specify the upper bound of the range:");
    scanf("%d", &u);

    for(int c = 1;c <= a ;c++) {
        n = rand() %(u - l) + l;
        printf("%d\n", n);
    }

}