Невозможно вернуть массив указателей в структуре - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в C ++. ниже мой код. Я видел правильный массив в "setValue", но в "main", я не могу получить правильное значение массива на strC. куда я скучал?

template <int N>
struct strA{
    int *p;
};

template <int N>
strA<N> setValue(int n)
{
    strA<N> strB;
    int m[N];
    // pointer initialization
    strB.p=m;
    for (int i=0; i<N;i++)
    {
        strB.p[i]=i+n;
    }
    return strB;
}

int main(){
    const int N=3;
    strA<N> strC;
    strC=setValue<N> (5);
    for (int i=0; i<N;i++)
    {
        cout<< strC.p[i]<<endl;
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Если вы объявляете массив в функции, подобной int m[n], и затем назначаете его указателю, этот указатель после функции не указывает ни на что. Вы должны выделить новую область и указать ее указателем strB.p, сделайте это в setValue

strB.p=new Int[n]
0 голосов
/ 30 августа 2018

Эти две строки в функции setValue являются проблемой:

int m[N];
strB.p=m;

Первая определенная m как локальная переменная. Как таковой он выйдет из области видимости и его время жизни закончится, как только функция вернется (переменная m по существу прекратит свое существование).

Во второй строке strB.p указывает на первые элементы этого массива.

Это означает, что когда функция вернет указатель, он немедленно станет недействительным, и любое его использование приведет к неопределенному поведению .

Естественным решением является использование std::array или std::vector:

template <int N>
struct strA{
    std::array<int, N> p;
};

template <int N>
strA<N> setValue(int n)
{
    strA<N> strB;
    for (int i=0; i<N;i++)
    {
        strB.p[i]=i+n;
    }
    return strB;
}

Временный массив не требуется.


Конечно, вы можете просто определить обычный массив в стиле C непосредственно в структуре, и при этом не требуется никакого временного массива, такого как m:

template <int N>
struct strA{
    int p[N];
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...