调用者和被调用者中数组元素的值不同

Posted

技术标签:

【中文标题】调用者和被调用者中数组元素的值不同【英文标题】:Value of array elements is different in caller and callee 【发布时间】:2020-04-21 14:33:47 【问题描述】:

我有一个将二维数组作为参数传递给另一个函数的函数。二维数组作为 int** 传递。

调用函数:

bool isMatch(string s, string p)

    int **dp;
    int* a[s.size()];
    dp = a;
    for(int i=0;i<s.size();i++)
    
        int b[p.size()];
        dp[i] = b;
    
    for(int i=0;i<s.size();i++)
    
        for(int j=0;j<p.size();j++)
        
            dp[i][j] = -1;
        
    
    cout<<dp[0][0]<<endl;
    return test(s,p,dp);

调用函数:

bool test(string s,string p,int **dp)

    cout<<dp[0][0]<<endl;
    return true;

现在,当我在 isMatch() 函数中打印 dp[0][0] 时,会打印 -1,这是预期值。但是,当我将二维数组传递给另一个函数(即 test())并打印 dp[0][0] 时,我会得到随机值,例如 950192880、337836240 等。为什么会发生这种情况,尽管所有内容都通过引用传递并且堆栈是直到调用者函数退出才清除?

【问题讨论】:

您需要发布minimal reproducible example。当ij 都没有被声明时,目前还不清楚cout&lt;&lt;dp[i][j]&lt;&lt;endl; 应该如何编译 dp[i] = b; -- b 在其作用域的最后一行死掉。 请不要编造一些幻想代码在这里发布。相反,请确保您发布的代码确实产生了您声称的输出。 抱歉,我在发帖时忘记更改 i 和 j 我已经更新了代码 @Quentin 谢谢!!没想到 【参考方案1】:

数组b是在for循环中声明的,所以在循环外是无效的。您说dp 的输出符合预期,但这是偶然的。你应该使用new分配b

【讨论】:

以上是关于调用者和被调用者中数组元素的值不同的主要内容,如果未能解决你的问题,请参考以下文章

被调用者分配被调用者释放

使用引用调用时被调用者和调用者的值

请大家解释一下Delphi的回调函数

面向对象设计原则四:依赖倒置原则

C#知识点整理

如何使用inspect从Python中的被调用者那里获取调用者的信息?