两次读指针就是给出垃圾值

时间:2013-12-29 16:33:34

标签: c++

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

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和其余是草本值

2 个答案:

答案 0 :(得分:5)

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

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

  • 在函数&amp;之前创建一个数组。将指针传递给函数。
  • 在函数内创建一个静态数组。
  • 在函数中使用动态内存(请记住在使用后释放它)
  • 使用可以在函数内部进行打包的全局数组。

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

在旁注中,void main()不是main()的标准指定原型,它应返回int

int main()

答案 1 :(得分:3)

  1. C ++程序中的主要功能应该是int main
  2. 返回指向局部变量的指针会显示未定义的行为。