【问题标题】:C: scanf() storing memory address integer instead of integer valueC:scanf() 存储内存地址整数而不是整数值
【发布时间】:2022-11-14 21:00:14
【问题描述】:

我正在编写一个 C 程序来获取五个科目的分数,计算平均分数并关联一个等级。

在扫描对象时,我注意到了意想不到的行为;扫描到的 score 整数变量存储的是整数的内存地址,而不是整数值的值。

例如,当从标准输入扫描 95,然后立即打印它时,我的程序会打印出 32859 的值。

我不确定这个错误的原因是什么,并认为这可能与我在 for 循环中使用 scanf() 的事实有关。如果您对如何解决我的问题有任何想法,请告诉我。任何提示都有帮助!

#define SUBJECTS 5

#include <stdio.h>

char * find_grade(float);

int main()
{
    int subject_score_sum;
    // Scan in the subjects
    for (int count = 0; count < SUBJECTS; count++)
    {
        int score;
        scanf("%d", &score);
        printf("%d\n", score);
        subject_score_sum += score;
        printf("%d\n", subject_score_sum);

    }



    float average_score = ((float)subject_score_sum / (float)SUBJECTS);

    

    printf("Average = %.2f\n%s\n", average_score, find_grade(average_score));


    return 0;
}

char * find_grade(float average_score)
{
    if(average_score >= 90)
    {
        return "Grade A";
    }
    else if(average_score >= 80)
    {
        return "Grade B";
    }
    else if(average_score >= 70)
    {
        return "Grade C";
    }
    else if(average_score >= 60)
    {
        return "Grade D";
    }
    else if(average_score >= 40)
    {
        return "Grade E";
    }
    else
    {
        return "Grade F";
    }
}

【问题讨论】:

  • 较大的值并不意味着它是一个地址。
  • “例如,当从标准输入扫描 95,然后立即打印时,我的程序会打印出 32859 的值。”无法重现。当我运行您的程序时,它会打印输入的值和未初始化的总和变量的值(+ 输入值的总和)。
  • “例如,当从标准输入扫描 95,然后立即打印时,我的程序会打印出 32859 的值。”我不相信你。

标签: c for-loop memory scanf


【解决方案1】:

你永远不会初始化变量subject_score_sum
因此,它的值是未定义的,printf("%d ", subject_score_sum); 只是打印一些东西。
更糟糕的是:这种未定义的行为意味着您的编译器可以将此程序编译成它想要的任何东西(甚至是加密所有文件的勒索软件!)。

另外,请务必检查scanf 的返回值。
scanf 返回成功读取格式化程序的数量(在您的情况下,这应该是 1)。

【讨论】:

  • 我将第 9 行中的变量 subject_score_sum 初始化为整数。
  • declare 第 9 行中的变量。但是,这不会初始化它。 C 不会为变量分配默认值(例如,Java)。因此,您必须使用0 (int subject_score_sum = 0;) 显式初始化它
  • @Akiyuu 这就是未定义行为的美妙之处:它是未定义的:D 除了笑话,值位于堆栈上。出于某种原因,使用浮点数时堆栈布局不同,或者编译器出于某种原因选择将其初始化为 0。很可能,恰好在堆栈上的正确位置有一个零。但这可能因编译器而异,甚至因机器而异,甚至因运行而异。不要依赖未定义的行为来做你想做的事!
  • @Akiyuu 你的答案是错误的。 subject_score_sum 未初始化。修复将其初始化为 0,例如int subject_score_sum = 0;
  • @Akiyuu“我将第 9 行中的变量 subject_score_sum 初始化为整数。”,不,您没有,您将其声明为int。声明和初始化是两件不同的事情。局部变量在 C 中未初始化为零。
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2017-05-31
相关资源
最近更新 更多