Wyszukiwanie w tablicy wskaźników do struktur

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 20

struct Plik {
	char * sciezka;
	char * typ;
	int dlugosc;
	char * wykonawca;
	char * tytul;
	char * gatunek;
};
void wyszukaj(int typ, char typ_szczegolowy, struct Plik * w_plik[])
{
	int ile = 0;
	struct Plik * wyszukane;
	struct Plik * kopia;
	switch(typ){
		case 0: // typ (MP3, WAV, OGG, itp.)
			for(int i=0; i<MAX; i++)
			{
				char * txt;
				strcpy(txt, w_plik[i]->typ);
				if(strcmp(txt, typ_szczegolowy) == 0)
				{
					kopia = malloc(sizeof(struct Plik));
					kopia = w_plik[i];
					wyszukane = kopia;
					ile++;
				}
			}
		break;
	}
	for(int i=0; i<ile; i++)
	{
		printf("%d. %s %s\n", i, wyszukane[i].typ, wyszukane[i].tytul);
	}
}
int main() {
	struct Plik pliki[5];
	pliki[0].sciezka = "d:/fsdfsd/costam.mp3";
	pliki[0].typ = "MP3";
	pliki[0].dlugosc = 434;
	pliki[0].tytul="csoa";
	pliki[1].sciezka = "d:/fsdfsd/cosfdsfdam.mp3";
	pliki[1].typ = "MP3";
	pliki[1].dlugosc = 434;
	pliki[1].tytul="csfgdoa";
	pliki[2].sciezka = "d:/fsdfsd/cosfdsfdam.mp3";
	pliki[2].typ = "WAV";
	pliki[2].dlugosc = 34;
	pliki[2].tytul="fsdfsdfsd";
	wyszukaj(0, "MP3", pliki);
	return EXIT_SUCCESS;
}

Nie rozumiem jeszcze o co chodzi w dynamicznej alokacji pamięci.
Program się kompiluje ale wywala.

0
void wyszukaj(int typ, char typ_szczegolowy, struct Plik * w_plik[])
{
    int ile = 0;
    struct Plik * wyszukane;
    struct Plik * kopia;
    switch(typ){ // zapoznaj się ze wskaźnikami na funkcje i zrób tablicę funkcji porównujących lub funkcji zwracających wartość odpowiedniego pola
        case 0: // typ (MP3, WAV, OGG, itp.)
            for(int i=0; i<MAX; i++) // nie używaj i++ kiedy można użyć ++i
            {
                char * txt;
                strcpy(txt, w_plik[i]->typ); // kopiujesz coś do nie przydzielonego wskaźnika, nić dziwnego że wywala, poza tym niepotrzebna ci ta kopia
                if(strcmp(txt, typ_szczegolowy) == 0) // zamiast (x==0) i czytelniej użyć (!x)
                {
                    kopia = malloc(sizeof(struct Plik)); // Nie rozumiem po kiego to przydzielenie
                    kopia = w_plik[i]; // tu już zgubiłeś to co przydzieliłeś
                    wyszukane = kopia; // czemu od razu nie wpisać w to wyszukiwanie
                    ile++; // nie używaj i++ kiedy można użyć ++i
                }
            }
        break;
    }
    for(int i=0; i<ile; i++) // nie używaj i++ kiedy można użyć ++i
    {
        printf("%d. %s %s\n", i, wyszukane[i].typ, wyszukane[i].tytul); // w formacie trzy parametry zaś podano tylko dwa - też będzie wywalać kiedy do tego dojdzie.
    }
}

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