Naruszenie ochrony pamieci przy wczytywaniu danych z pliku

0

Napisalem nastepujace funkcje

void zaladujDzialyZPliku(struct dzial **head, struct dzial **tail, struct dzial *pos) {
	FILE *dzial;
	char nazwaDzialu[20];
	int licznik=-1;

	if ((dzial = fopen("katalog.txt", "r")) == NULL) {
		bladOtwieraniaPliku();
		return;
	} 
	
	while (fscanf(dzial, "%20s", nazwaDzialu) != EOF) {
		if(dodajDzial(head, tail, pos, nazwaDzialu) == 1) licznik++;
	}

	fclose(dzial);

	pomyslnieDodano(licznik);
}

oraz

int dodajDzial(struct dzial **head, struct dzial **tail, struct dzial* pos, char nazwa[]) {	
        struct dzial *a;
        a = (struct dzial*)malloc(sizeof(struct dzial));
        
	char nazwaORG[20];
	strcpy(nazwaORG, nazwa);

	zamienNaMale(nazwa);

	strcpy(a->nazwa, nazwa);

        if (*head == NULL && *tail == NULL )
        {
		a->prev = NULL;
		a->next = NULL;
                *head = a;
                *tail = a;
                return 1;
        } 
	
	if(strcmp(nazwa,pos->nazwa) < 0) {
		a->next = *head;
		(*head)->prev = a;
		*head = a;
		strcpy(a->nazwa,nazwaORG);
		return 1;
	} 	

	while (pos != NULL) 
	{
		if(strcmp(nazwaORG,pos->nazwa) == 0) 
		{
			free(a);
			return 0;
		} else if(strcmp(nazwa,pos->nazwa) < 0) { //wstaw przed element POS
			a->next = pos;
			a->prev = pos->prev;
			pos = pos->prev;
			pos->next = a;
			pos = a->next;
			pos->prev = a;	
			strcpy(a->nazwa,nazwaORG);	
			return 1;
		} 
		pos = pos->next;
	}

	a->prev = *tail;
	(*tail)->next = a;
	*tail = a;

	strcpy(a->nazwa, nazwaORG);

	return 1;
}

Lista z zalozenia ma byc samoorganizujaca, tj. wstawiac elementy od razu w kolejnosci alfabetycznej. Funkcje generalnie dzialaja dobrze. Problem pojawia sie jezeli chce wczytac dane z pliku do pustej listy. Dostaje blad o naruszeniu ochrony pamieci, co nie wystepuje jezeli wczytuje dane pojedynczo, lub z pliku i lista jest wczesniej niepusta. Co moze sie dziac?

0
  1. Zastanów się czym jest ten struct dzial* pos i wywwal go z obu funkcji
  2. Dopilnuj aby a->prev i a->next byli inicjalizowane w każdym przypadku
  3. Twój "genialny" pomysł z podmianą nazwy nie zadziała ponieważ pozostałe działy mają nazwy nie koniecznie małymi.
  4. Narysuj sobie tą kolejkę i skróć to do jakiś 15 wierszy (jeżeli wyjdzie więcej to znaczy że wciąż masz chrzan)

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