Возвращение указателя из функции в C ++ - PullRequest
0 голосов
/ 23 января 2012

Когда я возвращаю указатель из функции, его значение может быть доступно по отдельности. Но когда для вывода значения этой переменной указателя используется цикл, отображается неправильное значение. Где я делаю ошибку, не могу понять это.

#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 ]

6 голосов
/ 23 января 2012

Вы возвращаете указатель на локальную переменную.

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, ", "));
}

Смотри, беги!

1 голос
/ 23 января 2012

Массив 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
0 голосов
/ 23 января 2012

Как уже отмечали другие, вы возвращаете указатель на локальную переменную, что является неопределенным поведением.Однако реальная проблема заключается в том, что вам нужно возвращать массив, а массивы в стиле C ломаются.Замените ваши массивы на std::vector<int>, забудьте про указатели (потому что вы имеете дело со значениями), и код будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...