Wypisanie elementów tablicy tworzoną w funkcji za pomocą wskaźnika nie działa prawidłowo

0

Witam bawię się wskaźnikami i niestety napotkałem błąd,stworzyłem 2 funkcje,pierwsza tworząca tablice i zwracająca jej wskaźnik druga wypisująca jej elementy.
Niestety wypisuje losowe znaki,gdy statycznie stworzę tablicę nie ma takich problemów;

#include<iostream>
using namespace std;
int *zapisz(int n)
{
	int tab[n];
	for(int i=0;i<n;i++)
	{
		cin>>tab[i];
		
		
	}
	int *wsk_tab=tab;
	return wsk_tab;
}

wypisz(int *wsk_tab,int n)
{
	cout<<"zawartosc tablicy:";
	for(int i=0;i<n;i++)
	{
		cout<<*(wsk_tab+i)<<" ";
		
	}
}
main()
{ int n;
	cin>>n;
wypisz(zapisz(n),n)	;
}

1

Zwracasz z funkcji wskaźnik do tablicy lokalnej, a potem używasz go po jej czasie życia. To UB. Co chcesz osiągnąć?

1
Herdion napisał(a):
#include<iostream>
using namespace std;
int *zapisz(int n)
{
	int tab[n];
	for(int i=0;i<n;i++)
	{
		cin>>tab[i];
	}
	int *wsk_tab=tab;
	return wsk_tab;
}

int tab[n] tworzy tablicę na stosie. To oznacza, że po wyjściu z funkcji zapisz zostanie ona zwolniona, a Ty zwracasz wskaźnik to zwolnionego miejsca. Musisz ją zaalokować dynamicznie:

int* tab = new int[n];
...
return tab;

Tylko, że w ten sposób musisz jeszcze pamiętać by po wypisaniu drobić delete [] na wskaźniku, który zwracasz, a ty go nigdzie nie trzymasz. Zrób raczej:

int* wsk = zapisz(n);
wypisz(wsk,n);
delete [] wsk;
0

Było niedawno na forum pytanie o takie rzeczy. Rozwiązanie swojego problemu znajdziesz np. tutaj – https://www.tutorialspoint.com/cplusplus/cpp_return_arrays_from_functions.htm

1 użytkowników online, w tym zalogowanych: 0, gości: 1