Возвращение указателя из функции - PullRequest
0 голосов
/ 11 июля 2019

Почему этот код не работает?Я уже нашел обходной путь, передав указатель на функцию, но мне интересно, есть ли более простое решение?

#include <stdio.h>

int* func() {
        int d[3];
        for (int f = 0; f < 3; f++)
                d[f] = 42;
        return d;
}


int main() {
        int* dptr;
        dptr = func();

        printf("Hi\n");

        for (int f = 0; f < 3; f++)
                 printf("%d\n",dptr[f]);
        return 0;
}

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Самый простой обходной путь - использовать std :: array (это предпочтительный метод)

#include <array>

std::array<int, 3> do_something() {
   std::array<int, 3> arr = {1, 2, 3};
   return arr;
}

int main() {
    do_something()[0];
}

Самое приятное в этом то, что компилятор создаст это на месте, то есть производительность не будет потеряна из-за копии.

3 голосов
/ 11 июля 2019

При return d; вы возвращаете указатель на локальную переменную, т. Е. Время жизни массива d заканчивается после завершения функции func. Доступ к этому массиву впоследствии (через возвращенный указатель) является неопределенным поведением.

Простым решением было бы сделать переменную d static так, чтобы ее время жизни продолжалось до конца программы:

int* func() {
    static int d[3];

Но учтите, что эта переменная d будет существовать в программе только один раз, так что результат одного вызова может быть изменен позже. Попробуйте использовать std::vector<int> в качестве возвращаемого типа или передать массив для изменения в качестве параметра функции void func(int[] d) {

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