调用函数后无法访问数组

Posted

技术标签:

【中文标题】调用函数后无法访问数组【英文标题】:Have no access to an array after a function has been called 【发布时间】:2018-09-22 19:58:47 【问题描述】:

我正在尝试更改 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() 吗?谢谢大家帮忙!

【问题讨论】:

由于 C++ 没有variable-length arrays,因此您的代码在技术上是无效的。 至于您的问题,请学习如何使用您的调试器来捕捉正在运行的崩溃,并在您的代码中定位它发生的时间和位置。 @Someprogrammerdude 当我进入第二个 for 循环试图打印出 ydot[i] 时,它显示 EXC_BAD_ACCESS。但是在调用 dydt() 之前如何才能成功打印出来呢? 顺便问一下,你所拥有的数组的实际大小会至少 18 元素吗?没有人会更小吗?你如何调用ode 函数?有什么论据?您可以尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示吗? 当您调用ode 时,len 有什么价值?如果小于 18,则进入未定义行为领域。 【参考方案1】:

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] << ",";
    
;

【讨论】:

非常感谢!我认为问题在于我没有在ode() 中为ydot 分配内存。谢谢大家的帮助! @cxc 如果你的编译器允许 VLA 扩展,你分配给它double ydot[len];

以上是关于调用函数后无法访问数组的主要内容,如果未能解决你的问题,请参考以下文章

无法调用基础构造函数 - 获取读取访问权限[重复]

尝试访问数组后,React 组件返回无法读取 null 的属性 '__reactInternalInstance$

无法从另一个函数(在全局范围内定义)访问变量(数组)

从函数返回时访问数组元素

AWS Lambda 函数无法访问 AppSync GraphQL API - 权限被拒绝

无法从函数返回的变量索引到空数组,或访问返回的正则表达式数据时出现问题