Данные массива повреждены после передачи указателя, C

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

правильный отпечаток: 11 5 1 2 3 4 5 10 20 30 40
неверно: 11 5 1 2 5024 96 0 0 20 30 40

(Проблемные области комментируются в CAPS)

[Arraytools.cpp]
#include "arraytools.h"#include <iostream>

using namespace std;

void DisplayArray (short int* a)
{
short int size = a[0];
int i;
for (i=0; i<size; i++)
{
cout<< a[i] << " ";
}
cout<<endl;
}

short int* ConcatArray (short int* a1, short int* a2)
{
short int size = a1[0] + a2[0] + 1;  //size of newarray
short int *ptr;          //pointer for newarray
short int newarray[size];  //initializing new array with given new size
newarray[0] = size;    //making first object in new array the size of it

int i,j;
for (i=0; i<a1[0]; i++)  //loop to store first array objects to newarray
{
newarray[i+1] = a1[i];
}

int lastpoint = a1[0] + 1;  //marks the point to start adding the second array to newarray
for (j=0; j<a2[0]; j++)  //loop to store second array objects to newarray
{
newarray[lastpoint] = a2[j];
lastpoint++;

}

ptr = &newarray[0];  //assigning new array to pointer
DisplayArray(ptr);  //PRINTS CORRECTLY HERE
return ptr;
}
[Main.cpp]
#include "arraytools.h"#include <iostream>
using namespace std;

int main()
{
char choice = 'y';  //user defined later in program
while (choice == 'y') // for repeating process
{
//declaring two arrays of short int
short int arr1[] = {5,1,2,3,4};
short int arr2[] = {5, 10, 20, 30, 40};

//pointers to refer to declared arrays
short int* nptr, *ar1, *ar2;

ar1 =arr1;
ar2 =arr2;

DisplayArray(ar1);
DisplayArray(ar2);

nptr = ConcatArray(ar1, ar2); //RECIEVES RETURNED POINTER
DisplayArray(nptr);  //PRINTS INCORRECTLY

cout<<"Run process again? y/n: "; //loop exit condition
cin >> choice;
}
return 0;
}

0

Решение

Эта строка является корнем проблемы:

short int newarray[size];

Он размещает массив в стеке, а затем вы возвращаете адрес этого, даже если он становится недействительным, как только вы вернетесь из этой функции. Попробуй это:

short *newarray = new short [size];

Теперь это идет в кучу. Конечно, вы также должны удалить это с помощью оператора delete [], когда он вам больше не нужен, например, в main после печати:

delete[] nptr;
4

Другие решения

Вы размещаете newarray «в стеке». Он будет возвращен после выхода из области видимости (то есть функция завершится). Используйте malloc, если вы действительно хотите это сделать. Или, если вы действительно используете C ++, рассмотрите лучший контейнер, такой как std :: vector.

ConcatArray (short int* a1, short int* a2)
{
short int size = a1[0] + a2[0] + 1;  //size of newarray
short int *ptr;          //pointer for newarray
short int newarray[size];  //initializing new array with given new size
4

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

2

Ваша функция возвращает указатель на локальную переменную, которая хранится в стеке. Вам нужна память Malloc для ваших данных.

1