Эти две строки в функции 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];
};