调用函数后无法访问数组

时间:2018-09-22 19:58:47

标签: c++ arrays pointers function-pointers pass-by-reference

我试图在func()中更改ydot []的值,以便可以在我的ode()函数中使用它。但是,在调用func()之后,似乎再也无法访问ydot []了。我将func()作为称为dydt的函数指针传递给ode()。这是我的两个功能:

    void func(double t, double y[], double ydot[])
    {
        for(int i = 0; i < 18; i++){
            ydot[i] = y[i]+1;
        }
    }

    typedef void (*dydt_func)(double t, double y[ ], double ydot[ ]);

    void ode(double y0[ ], double yend[ ], int len, double t0,
             double t1, dydt_func dydt)
    {
        double ydot[len];

        dydt = &func;

        //This prints out all the value of ydot[] just fine
        for (int i = 0; i < 18; i++){
            cout << ydot[i] << ",";
        }

        dydt(t1, y0, ydot);

        //This SHOULD print all the revised value of ydot[]
        //But I get an error instead:
        //Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

        for (int i = 0; i < 18; i++){
            cout << ydot[i] << ",";
        }
    };

在调用dydt()之前,我可以访问ydot []。我使用函数指针的方式有问题吗?还是应该将ydot []的指针传递给func()?谢谢你们的帮助!

1 个答案:

答案 0 :(得分:0)

C ++没有像C那样的可变长度数组,因此您需要使用new来分配具有可变大小的数组,或者使用std::vector而不是数组。

您需要将数组的大小传递给func,以便将其更新的元素数限制为该大小。如果数组长度小于18,则您的代码将具有未定义的行为。

void func(double t, double y[], double ydot[], int len)
{
    for(int i = 0; i < len; i++){
        ydot[i] = y[i]+1;
    }
}

typedef void (*dydt_func)(double t, double y[ ], double ydot[ ], int len);

void ode(double y0[ ], double yend[ ], int len, double t0,
         double t1, dydt_func dydt)
{
    double *ydot = new double[len];

    dydt = &func;

    //This prints out all the value of ydot[] just fine
    for (int i = 0; i < 18; i++){
        cout << ydot[i] << ",";
    }

    dydt(t1, y0, ydot, len);

    for (int i = 0; i < len; i++){
        cout << ydot[i] << ",";
    }
};