Возвращаемые массивы из функции в c ++

Я пытаюсь вернуть массив из функции:

#include  using namespace std; int* uni(int *a,int *b) { int c[10]; int i=0; while(a[i]!=-1) { c[i]=a[i]; i++; } for(;i<10;i++) c[i]=b[i-5]; return c; } int main() { int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1}; int b[5]={1,3,4,3,0}; int *c=uni(a,b); for(int i=0;i<10;i++) cout<<c[i]<<" "; cout<<"\n"; return 0; } 

Я передаю два массива из моего main() в мою функцию uni() . Там я создаю новый массив c[10] который я возвращаю в свой main() . В моей функции uni() я пытаюсь объединить неотрицательные числа в двух массивах a и b .

Но я получаю что-то вроде этого в качестве вывода.

 1 -1078199700 134514080 -1078199656 -1216637148 134519488 134519297 134519488 8 -1078199700 

Если я пытаюсь напечатать значения c[10] в функции uni() он печатает правильные значения. Почему это происходит? Это что-то связано со стеком? Поскольку я попытался найти эту ошибку, и нашел несколько мест в stackoverflow, где говорится, что do not allocate on stack но я не мог этого понять.

Далее стало бы очень легко, если бы я выделил свой массив глобально, но если это так, тогда все объявляется глобально? Почему мы даже беспокоимся о прохождении указателей от функций? (У меня есть глава в моей книге для прохода указателей)

По общему признанию, путь std::vector или std::array был бы способом.

Однако, просто для того, чтобы обойти все (и если это школьный проект, где преподаватель дает вам обязательный «вы не можете использовать STL»), другая альтернатива, которая позволит избежать использования указателя, – это обернуть массив внутри структуры и верните экземпляр структуры.

 #include  using namespace std; struct myArray { int array[10]; }; myArray uni(int *a,int *b) { myArray c; int i=0; while(a[i]!=-1) { c.array[i]=a[i]; i++; } for(;i<10;i++) c.array[i]=b[i-5]; return c; } int main() { int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1}; int b[5]={1,3,4,3,0}; myArray c = uni(a,b); for(int i=0;i<10;i++) cout << c.array[i] << " "; cout << "\n"; return 0; } в #include  using namespace std; struct myArray { int array[10]; }; myArray uni(int *a,int *b) { myArray c; int i=0; while(a[i]!=-1) { c.array[i]=a[i]; i++; } for(;i<10;i++) c.array[i]=b[i-5]; return c; } int main() { int a[10]={1,3,3,8,4,-1,-1,-1,-1,-1}; int b[5]={1,3,4,3,0}; myArray c = uni(a,b); for(int i=0;i<10;i++) cout << c.array[i] << " "; cout << "\n"; return 0; } 

Обратите внимание, что struct возвращается значением, и это возвращаемое значение назначается в main .

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

Живой пример

Вы возвращаете указатель на локальный объект. В uni функции переменная c выделяется в стеке. В конце этой функции вся эта память освобождается, а в цикле for вы получаете неопределенные результаты.

Как было предложено в комментариях, std::array или std::vector предоставят вам конструкторы копирования, которые позволят вам вернуть объект по значению, как вы пытаетесь сделать. В противном случае вам придется прибегать к чему-то вроде передачи вашего выходного массива в качестве аргумента.

Вы возвращаете указатель на массив, который освобождается от оператора return. Это свисающий указатель. Это UB.

Используйте std::vector или std::array и возвращайте значение. Есть оптимизация компилятора, которая позволит избежать неэффективности.

  • Почему я не могу преобразовать 'char **' в 'const char * const *' в C?
  • Почему полезен указатель «точка-volatile», например «volatile int * p»?
  • error: неверная инициализация не-const ссылки типа 'int &' из rvalue типа 'int'
  • Что является результатом NULL + int?
  • Почему «это» - это указатель, а не ссылка?
  • Ошибка сегментации при изменении строки с помощью указателей?
  • Как найти «sizeof» (указатель, указывающий на массив)?
  • C ++ передает массив по ссылке
  • Длина массива в аргументе функции
  • Почему массивы в C распадаются на указатели?
  • C указатель на двумерный массив
  • Давайте будем гением компьютера.