从C ++中的函数返回指针

时间:2012-01-23 09:15:28

标签: c++ arrays pointers

当我从函数返回指针时,可以单独访问其值。但是当使用循环输出该指针变量的值时,会显示错误的值。在我犯错的地方,无法弄清楚。

#include <iostream>
#include <conio.h>

int *cal(int *, int*);

using namespace std;

int main()
{
    int a[]={5,6,7,8,9};
    int b[]={0,3,5,2,1};
    int *c;
    c=cal(a,b);

    //Wrong outpur here
    /*for(int i=0;i<5;i++)
    {
        cout<<*(c+i);
    }*/

    //Correct output here
    cout<<*(c+0);
    cout<<*(c+1);
    cout<<*(c+2);
    cout<<*(c+3);
    cout<<*(c+4);

return 0;
}   

int *cal(int *d, int *e)
{
    int k[5];
    for(int j=0;j<5;j++)
    {
        *(k+j)=*(d+j)-*(e+j);
    }
    return k;
}

3 个答案:

答案 0 :(得分:6)

您正在返回指向局部变量的指针。

在堆栈上创建

k。退出堆栈时cal()退出并且内存空闲。之后引用该内存会导致未定义的行为(如此处精美地解释:https://stackoverflow.com/a/6445794/78845)。

你的C ++编译器应该警告你这个,你应该留意这些警告。

对于它的价值,以下是我在C ++中实现它的方法:

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>

int main()
{
    int a[] = {5, 6, 7, 8, 9};
    int b[] = {0, 3, 5, 2, 1};
    int c[5];
    std::transform (a, a + 5, b, c, std::minus<int>());
    std::copy(c, c + 5, std::ostream_iterator<int>(std::cout, ", "));
}

See it run!

答案 1 :(得分:1)

在堆栈上创建int k[5]数组。因此,当它从cal返回时,它会在超出范围时被破坏。您可以使用第三个参数作为输出数组:

void cal(int *d, int *e, int* k)
{
    for(int j=0;j<5;j++)
    {
        *(k+j)=*(d+j)-*(e+j);
    }
}

像这样打电话给cal

int a[]={5,6,7,8,9};
int b[]={0,3,5,2,1};
int c[5];
cal (a, b, c); // after returning from cal, c will be populated with desired values

答案 2 :(得分:0)

正如其他人所指出的,你正在返回一个指向本地的指针 变量,这是未定义的行为。然而,真正的问题是 您需要返回一个数组,并且C样式数组已被破坏。 用std::vector<int>替换你的数组,忘记指针 (因为你正在处理值),代码将起作用。