Witam.
Potrzebuję pomocy z zapełnianiem tablicy dynamicznej w C. Siedzę nad tym już wiele godzin, a w google nie mogę znaleźć zrozumiałych dla mnie odpowiedzi, które by mi to wytłumaczyły, a czas płynie bardzo szybko.
Mam dwie struktury - oprawa i szklo. Mają one po dwa elementy (dobrze to nazwałem?) -int cena oraz int numer. Muszę dynamicznie stworzyć ich tablice, a następnie te tablice wypełnić, gdzie int numery są wypełniane automatycznie od 0 do n (aktualnie w kodzie jest do 5), a int ceny są ustawiane przez użytkownika. Na koniec, po wywołaniu w switchu funkcji “czyszczących”, te tablice muszą być usunięte.
Podany kod da się skompilować, ale program od razu się crashuje, bo źle próbuję stworzyć tablice. Wiem też, że w C nie ma czegoś takiego jak referencja (te funkcje dodające elementy w switchu są źle napisane), więc powinienem przez returna zwrócić wartości tablic, ale nie wiem jak dokładnie to zrobić.
#include 
#include 
typedef struct oprawa
{
	int numer;
	int cena;
}oprawa;
typedef struct szklo
{
	int numer;
	int cena;
}szklo;
oprawa stworz_tablice_opraw(oprawa * tablica_opraw)
{
	tablica_opraw = (oprawa*)malloc(5*sizeof(oprawa));
	return *tablica_opraw;
}
szklo stworz_tablice_szkiel(szklo * tablica_szkiel)
{
	tablica_szkiel = (szklo*)malloc(5*sizeof(szklo));
	return *tablica_szkiel;
}
int menu(int wybor)
{
	printf("\n1)Dodaj oprawe,\n2)Dodaj szklo,\n3)Wyczysc pamiec, \n4)Wyswietl dane,"
			"\n9)Wyjdz z programu.\n\n\nPodaj numer opcji do wyboru: ");
	scanf("%d",&wybor);
	return wybor;
}
int koniec_pracy(int wybor)
{
	printf("\n\nKoniec pracy programu.\n");
	return 9;
}
int error(int wybor)
{
	printf("\n\nPodales niewlasciwa komende.\n");
	return 0;
}
int dodaj_oprawe(oprawa * tablica_opraw)
{
	int cena;
	for(int i = 0; i < 5; i++)
	{
		printf("\nPodaj cene oprawy nr ",i," : ");
		scanf("%d",&cena);
		tablica_opraw[i].cena = cena;		
	}
	return ilosc;
}
int dodaj_szklo(szklo * tablica_szkiel)
{
	int cena;
	for(int i = 0; i < 5; i++)
	{
		printf("\nPodaj cene szkla nr ",i," : ");
		scanf("%d",&cena);
		tablica_szkiel[i].cena = cena;		
	}
	return ilosc;
}
void wyswietl(oprawa * tablica_opraw, szklo * tablica_szkiel)
{
	for (int i = 0; i < 5; i++)
	{
		printf("Oprawa nr. ",i," kosztuje ",tablica_opraw[i].cena);
		printf("szklo nr. ",i," kosztuje ",tablica_szkiel[i].cena);
	}
}
oprawa wyczysc_oprawy(oprawa * tablica_opraw)
{
	printf("\nOprawy usuniete.");
	free(tablica_opraw);
	return *tablica_opraw;
}
szklo wyczysc_szkla(szklo * tablica_szkiel)
{
	printf("\nSzkla usuniete.");
	free(tablica_szkiel);
	return *tablica_szkiel;
}
// /=============\ //
//============================== funkcja main =============================//
// \=============/ //
int main() 
{
	int ilosc;
	oprawa * tablica_opraw;
	szklo * tablica_szkiel;
	*tablica_opraw = stworz_tablice_opraw(tablica_opraw);
	*tablica_szkiel = stworz_tablice_szkiel(tablica_szkiel);
	int wybor = 0;	
	while(wybor != 9)
	{
		wybor = menu(wybor);		
		switch(wybor)
		{
			case 1:
				dodaj_oprawe(tablica_opraw);
				break;
			case 2:
				dodaj_szklo(tablica_szkiel);
				break;
			case 3:
				wyczysc_oprawy(tablica_opraw);
				wyczysc_szkla(tablica_szkiel);
				break;
			case 4:
				wyswietl(tablica_opraw, tablica_szkiel);
				break;
			case 9:
				wybor = koniec_pracy(wybor);
				break;
			default:
				wybor = error(wybor);
				break;
		}
	}
	system("pause");	
	return 0;
}
// /====================\ //
//========================== koniec funkcji main =========================//
// \====================/ //