为什么这个C ++程序会崩溃运行时?

时间:2014-08-18 00:07:42

标签: c++ arrays debugging

我是C ++的新手,我正在尝试用C ++编写程序。以下是我的代码。说到评论//PROGRAM crashes指示的行,程序崩溃并发出此错误:Process returned -1073741819 (0xC0000005)

#include <iostream>
#include <cmath>
#include <fstream>
#include <cassert>

using namespace std;

int main (int argc, char* argv[])
{
    double simTime = 5;
    double r = 0.9;
    double t, F = 1;
    int i, counter = 0;
    int n = 100;

    double* u_n = new double[n];
    double* u_n_minus_one = new double[n];
    double* u_n_plus_one = new double[n];

    for (i=0;i<n;i++)
    {
        u_n[i]=0;
        u_n_minus_one[i]=0;
        u_n_plus_one[i]=0;
    }

    std::ofstream fw1("Values.txt");
    assert(fw1.is_open());

    for (t = 0; t <= simTime; t = t + 0.5)
    {
        for (i = 1; i <= (n-2); i++)
        {
            u_n_plus_one[i] =  pow(r, 2) * (u_n[i-1] + u_n[i+1]) + 2 * (1 - pow(r, 2)) * u_n[i] -u_n_minus_one[i];
        }

        u_n_plus_one[0] = 0;
        u_n_plus_one[int(floor((n)/2))] = F;
        u_n_plus_one[n-1] = 0;

        for (i=0;i<n;i++)
        {
            u_n_minus_one[i] = u_n[i];
        }

        for (i=0;i<n;i++)
        {
            u_n[i] = u_n_plus_one[i];
        }

        fw1.precision(6);

        //PROGRAM crashes here.
        for (i=0; i<n; i++)
        {
            fw1 << u_n_plus_one[i] << '\t';
        }

        fw1 << std::endl;

        fw1.close();

        delete[] u_n; delete[] u_n_plus_one; delete[] u_n_minus_one;
    }
}

我用Code :: Blocks调试器找到了这个崩溃位置。基本上,当我尝试进一步调试时,即获取数组u_n_plus_one的内容,程序崩溃。 Code :: Blocks调试器似乎没有给出数组的内容。我有以下与该计划相关的具体问题。

  1. 究竟是什么导致失败以及如何调试?
  2. 如果我想在Code :: Blocks中获取数组的内容,我可以得到吗?这意味着,如果一个数组只有4个元素,我可以获得所有4个元素的列表,或者如果一个数组有1000个元素,那么我可以在第50个位置获得元素吗?
  3. 我可以在调试器中进行变量操作吗?我的意思是,在MATLAB中,如果我正在调试,我可以在命令窗口中输入命令,比如说A + B并得到结果。用C ++可以吗?
  4. 我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

原因很简单。您正在关闭文件并处理所有变量,同时仍在循环for (t=0;t<=simTime;t=t+0.5)内。

第一次完成循环是可以的,第二次在使用已删除的所有变量并尝试写入已关闭的文件时调用未定义的行为。

如果您正确缩进代码,所有这些都很容易被发现。看起来很重要!

答案 1 :(得分:1)

您正在删除变量并在for循环中关闭fw1。你可能打算:

}

delete[] u_n; delete[] u_n_plus_one; delete[] u_n_minus_one;
fw1.close();

}