【问题标题】:Run-Time Check Failure #2 - Stack around the variable 'projectAverage' was corrupted运行时检查失败 #2 - 变量“projectAverage”周围的堆栈已损坏
【发布时间】:2015-05-24 01:54:24
【问题描述】:
#include <iostream>
#include <iomanip>
using namespace std;

int main(){
    double hw = 0, hwTotal = 0, hwAverage[3], id[3], project = 0, projTotal = 0, projectAverage[3], hwProj, finalExam[3], total[3];
    int i = 0, j = 0, k = 0;

    for (j = 0; j < 3; j++){
        cout << "Input student ID: ";
        cin >> id[i];
        for (i = 0; i < 4; i++){
            cout << "Input homework assignment grade: ";
            cin >> hw;

            hwTotal = hwTotal + hw;
        }

        hwAverage[j] = hwTotal / 4;

        for (i = 0; i < 2; i++){
            cout << "Input project grade: ";
            cin >> project;

            projTotal = projTotal + project;
        }

        projectAverage[j] = projTotal / 2;

        hwProj = (hwAverage[j] + projectAverage[j]) / 2;

        cout << "Input final exam grade: ";
        cin >> finalExam[j];

        total[j] = (finalExam[j] + hwProj) / 2;
    }

    cout << endl;

    for (k = 0; k < 3; k++){
        cout << "Student ID: " << id[k] << endl;
        cout << "Homework Average: " << hwAverage[k] << endl;
        cout << "Project Average: " << projectAverage[k] << endl;
        cout << "Final exam grade: " << finalExam[k] << endl;
        cout << "Final average: " << total[k] << endl;

        cout << endl;
    }

    return 0;
}

由于某种原因,当我运行此代码时,我的输出如下所示:

  • 输入学生证:123
  • 输入家庭作业等级:100
  • 输入家庭作业等级:100
  • 输入家庭作业等级:100
  • 输入家庭作业等级:100
  • 输入项目等级:100
  • 输入项目等级:100
  • 输入期末考试成绩:100
  • 输入学号:12
  • 输入家庭作业等级:40
  • 输入家庭作业等级:40
  • 输入家庭作业等级:40
  • 输入家庭作业等级:40
  • 输入项目等级:40
  • 输入项目等级:40
  • 输入期末考试成绩:40
  • 输入学生证:1
  • 输入家庭作业等级:20
  • 输入家庭作业等级:20
  • 输入家庭作业等级:20
  • 输入家庭作业等级:20
  • 输入项目等级:20
  • 输入项目等级:20
  • 输入期末考试成绩:20

  • 学生编号:123

  • 平均功课:100
  • 项目平均:100
  • 期末考试成绩:100
  • 最终平均:100

  • 学生编号:-9.25596e+061

  • 家庭作业平均:140
  • 项目平均:140
  • 期末考试成绩:40
  • 最终平均:90

  • 学生编号:1

  • 平均功课:160
  • 项目平均:160
  • 期末考试成绩:20
  • 最终平均:90

  • 按任意键继续。 . .

我得到一个堆栈溢出错误。我对 C++ 很陌生,我正在制作一个程序,要求用户提供 10 个家庭作业成绩、2 个项目成绩和 10 个学生的期末考试成绩(我的程序中的数字较低,因此我可以测试更容易)。我打算分别平均家庭作业成绩和项目成绩,然后平均这些平均数,然后将该平均数与期末考试成绩平均为总平均数(对不起所有平均数),但它似乎不起作用并且我不知道为什么。就像我说的,我对 C++ 很陌生,甚至对数组也很陌生,所以你认为你们中的任何人都可以给我一些关于我哪里出错的见解吗?非常感谢!

【问题讨论】:

  • 你认为在同一行声明变量会让你的代码更快吗?
  • 那么如何为循环声明不同的变量呢?而不是在整个过程中使用i
  • 我并没有考虑通过将它们都声明在同一行上来加快速度,这对我来说更容易可视化,而且对我来说看起来更有视觉效率。老实说,这只是视觉上的东西。
  • hwAverage[10] , projectAverage[10] , total[10]finalExam[10] - 你在这里越界了。
  • 我刚刚注意到并修复了它们,并且我为循环添加了更多变量,但我似乎无法让它工作。事实上,只有第一个学生工作的平均值,然后下一个学生的信息不正确。我已经更新了上面的代码。

标签: c++ arrays for-loop stack overflow


【解决方案1】:

10 用作数组索引对于其中包含10 元素的数组是错误的。这会导致未定义的行为。

另外,使用相同的for 循环变量听起来也不对。您可以将i 用于外部for 循环,将j 用于内部for 循环。按照现在的代码,您的外部 for 循环将永远不会终止,因为 i 的值在内部循环中被重置。

使用

int i;
int j;   // New variable.

for (i = 0; i < 3; i++){
    cout << "Input student ID: ";
    cin >> id[i];
    for (j = 0; j < 4; j++){  // Use j here
        cout << "Input homework assignment grade: ";
        cin >> hw;

        hwTotal = hwTotal + hw;
    }

    hwAverage[i] = hwTotal / 10;

    for (j = 0; j < 2; j++){   // Use j here
        cout << "Input project grade: ";
        cin >> project;

        projTotal = projTotal + project;
    }

    projectAverage[10] = projTotal / 2;  // Fix the index.
                                         // I can't tell what's the right
                                         // index but it has to be  0 - 9.

    projectAverage[i] = projTotal / 2;   // Perhaps???

    hwProj = (hwAverage[10] + projectAverage[10]) / 2; // Fix index here too.
    hwProj = (hwAverage[i] + projectAverage[i]) / 2;   // Perehaps???

    cout << "Input final exam grade: ";
    cin >> finalExam[10];   // Fix index here too.
    cin >> finalExam[i];    // Perhaps???

    total[10] = (finalExam[10] + hwProj) / 2; // Fix index here too.
    total[i] = (finalExam[i] + hwProj) / 2;   // Perhaps???
}

【讨论】:

    【解决方案2】:

    像 hwAverage 这样的数组有 10 个元素(从 [0] 到 [9]),但您引用的是元素 [10]。

    要么定义更多元素,要么使用不同的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2013-12-13
      • 2013-12-10
      • 2015-02-09
      • 2021-12-31
      • 2014-10-20
      • 2014-07-01
      相关资源
      最近更新 更多