【问题标题】:C++ .exe "has stopped working" after calling function twice调用函数两次后,C++ .exe“已停止工作”
【发布时间】:2023-03-28 03:46:01
【问题描述】:

所以我有一个 C++ 程序,它调用一个函数三次,我正在使用 Code::Blocks 制作这个项目,当我运行 .exe 的发布版本时,它告诉我程序已经停止工作并且我必须关闭程序。我尝试只调用一次该函数并且它可以工作,无论我离开哪个调用。所以看起来它只有在被调用两次时才会崩溃,不管我传递了哪些变量。知道为什么会这样吗? 这是我调用的函数:

int interval(int h, int i, std::vector< std::vector<int> >& Array, int arr[], int interv)
{
    int k = i + 1;
    int P[20];
    int number;
    bool a;
    int b;
    int N;
    int maxres;
    int result[90];

    for (h = 0; h < 20; h++)
    {
        for (N = 1; N <= 90; N += 1)
        {
            result[N] = 0;
            for (i = 1; i <= (k - interv); i++)
            {
                number = Array[i - 1][h] - N;
                if (number <= 0)
                    number += 90;
                for (b = 0; b < 20; b++)
                {
                    a = false;
                    if ((number == Array[i][b]) || ( (interv == 1) && (number == Array[i + 1][b]) ) || ( (interv == 2) && (number == Array[i + 2][b]) ) )
                    {
                        a = true;
                        result[N]++;
                        break;
                    }
                }
                if (!a)
                    break;
            }
           if (N == 1)
                maxres = N;
           else
           {
                if (result[N] >= result[maxres])
                    maxres = N;
           }
        }
        P[h] = maxres;
    }

    for (h = 0; h < 20; h++)
    {
        arr[h] = Array[0][h] + P[h];
        if ( arr[h] > 90 )
            arr[h] -= 90;
    }
    return 0;
}

这里是电话:

int c[20];
int e[20];
int d[20];

interval(h, i, Array, c, 0);
interval(h, i, Array, e, 1);
interval(h, i, Array, d, 2);

【问题讨论】:

  • 发布你的代码吧?
  • 您的代码中存在错误。这就是任何人都可以说它为什么会发生的原因。如果您发布代码,有人可能会发现错误。
  • [sigh] 调用一次,在入口处下断点,再次调用,单步执行代码,找出导致问题的行。如果需要,请重复以在崩溃前检查行上的所有相关变量。如果您仍然卡住,请再次发帖,告诉我们您发现了什么。
  • 您需要发布hi 以及更重要的是Array 的声明和值。您在 interval() 中使用 Array 而不检查您是否在范围内。

标签: c++ function crash codeblocks


【解决方案1】:

一个问题是对result的越界访问:

int result[90];

for (h = 0; h < 20; h++)
{
    for (N = 1; N <= 90; N += 1)   <--- Here!
    {
        result[N] = 0;

N 的允许值为 0 到 89(如 for (N = 0; N != 90; ++N)

这里可能有类似的问题

        for (i = 1; i <= (k - interv); i++)

但我不能确定。

【讨论】:

  • 你说得对,我应该注意到这一点!现在可以了,谢谢
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多