【问题标题】:format '%d' expects argument of type 'int *', but argument has type 'int' [duplicate]格式“%d”需要“int *”类型的参数,但参数的类型为“int”[重复]
【发布时间】:2016-09-27 00:12:43
【问题描述】:
 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);
    }

}

【问题讨论】:

  • 任何关于使用scanf() 的C 教程都应该清楚地解释这一点。

标签: c


【解决方案1】:
scanf("%d", &a);

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

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

【讨论】:

    【解决方案2】:

    你需要传递变量的地址,因为scanf()会将值存储在里面。

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

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

    1. 解除对无效指针的引用
    2. 为给定的格式说明符传递了不正确的类型。
    3. 从未初始化的变量中读取。

    要传递地址,请使用运算符的&amp; 地址

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

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

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

    一般来说,只有当您真的知道自己在做什么时,您才应该忽略警告。几乎从来没有,你会故意做一些会触发警告的事情,尽管在某些情况下它可能是合法的。

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

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

    【讨论】:

      【解决方案3】:

      在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);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 2014-02-03
        相关资源
        最近更新 更多