【问题标题】:Reading pointers twice is giving garbage values两次读取指针会给出垃圾值
【发布时间】:2013-12-29 16:33:34
【问题描述】:

我想通过指向主函数的指针返回在本地函数中创建的数组。我的代码如下。返回数组,我只能逐个元素访问每个元素一次。下一次它给出垃圾值。怎么了?

void DoWork(int** ppOut , int& nSize)
{
    int m[5];
    for(int i = 0 ; i < 5 ; i++)
        {
            m[i] = i;
        }

    nSize = 5;
    cout << m[0] << endl;
    cout << m[1] << endl;
    cout << m[2] << endl;
    cout << m[3] << endl;
    cout << m[4] << endl;

    *ppOut = &m[0];

    //delete [] m;
}

void main()
{
    int nSize = -1;
    int i;
    int* f = NULL; 

    DoWork(&f , nSize);

    cout << f[3] << endl;
    cout << f[0] << endl;
    cout << f[2] << endl;
    cout << f[3] << endl;
    cout << f[4] << endl;

    _getch();
}

输出是:-- 本地函数的 0 1 2 3 4。 但在主要 3 和其余部分是抓取值

【问题讨论】:

  • 大量未定义的行为、非法和/或非标准 C++。您的主要问题是您正在存储指向临时的指针。 main()总是返回int_getch() 肯定是非标准的(使用 std::cin.ignore() 代替)。
  • @OP:为什么不 google 这个...(不,请不要告诉我它很难搜索。我对这种废话不感兴趣。 )
  • @H2CO3:因为在谷歌上搜索需要了解要搜索的内容。

标签: c++


【解决方案1】:

问题:
数组m 是一个局部数组,它在函数DoWork() 的生命周期之外不存在。当你这样做时,你最终得到的是未定义的行为,这基本上意味着你可以看到任何可观察到的行为,因为该程序不再是 C++ 标准批准的程序,因此它可以显示(字面意思)任何行为。

解决方案:
您将需要延长 m 的生命周期,以便即使在函数返回后它仍然有效。有很多方法可以做到这一点:

  • 在函数之前创建一个数组并将指向它的指针传递给函数。
  • 在函数内部创建一个静态数组。
  • 在函数中为数组使用动态内存(使用后记得释放)
  • 使用可以在函数内部填充的全局数组。

每个人都有自己的优点和缺点,而且课程的马更多。

附带说明,void main() 不是main() 的标准指定原型,它应该返回一个int

int main()

【讨论】:

  • 但是在主函数中,如果一次访问一个,我可以从 m 获取值...即 f[0] = 0 ,如果只使用一个 f[4]= 4如果我使用它两次,它会给出垃圾值
  • @user3144247:使用它完全是未定义的。您只是以这种方式查看幽灵数据。阅读this
【解决方案2】:
  1. C++ 程序中的主函数应该是int main
  2. 返回指向局部变量的指针会表现出未定义的行为。

【讨论】:

  • 这里付出了很多努力;P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多