Problem ze strykturą i zwalnianiem pamieci

0

cześć mam problem z nieobsługiwanym wyjątkiem. MV zgłasza mi "Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu.
WW2 było nullptr."" po wywołaniu funkcji czysc ale tylko gdy stos jest pusty .Proszę o pomoc

void *MY_STUDENT_MALLOC(char *nnazwisko, size_t size_nnazwisko, size_t rok, KIERUNEK kierunek)
{
	MY_STUDENT *WW1 = (MY_STUDENT *)malloc(sizeof(MY_STUDENT));

	if (WW1)
	{
		WW1->nazwisko = (char *)malloc(size_nnazwisko * sizeof(char));
		if (!(WW1->nazwisko))
			printf("error // MY_STUDENT_MALLOC2");
		memcpy(WW1->nazwisko, nnazwisko, size_nnazwisko);
		WW1->size_nazwisko = size_nnazwisko;
		WW1->rok = rok;
		WW1->kierunek = kierunek;
	}
	else printf("error // MY_STUDENT_MALLOC2 ");
	return (void *)(WW1);
}

void MY_STUDENT_CZYSC(void *wsk)
{
	
	MY_STUDENT *WW2 = (MY_STUDENT *)wsk;
	
	
	if (WW2->nazwisko) {                 // Tu zgłasza wyjątek
		free((WW2)->nazwisko);
		
		
	}
	if (WW2 == NULL) {
		printf("Pusto1");
	}
	else if (WW2) {
		free(WW2);
	}

	}

struct MY_STUDENT
{
	enum KIERUNEK kierunek;
	char *nazwisko;
	size_t size_nazwisko;
	size_t rok;
};

0

Słusznie piszą w komentarzach, można to uprościć bez tych "voidów", przykładowa struktura:

typedef struct {
	int val;
}Example;

Example * exampleInit() {
	 Example * obj = (Example * ) malloc(sizeof(Example));
	if (obj == NULL) {
		fprintf(stderr, "%s", "Example, constructor: Malloc failed!\n");
		abort();
	}
return obj;
}

void clear(Example ** ptr) {
	free(*ptr);
	*ptr = NULL;
}
0

Tylko program niestety musi mieć te "voidy" jest to zarzucone z góry , a da się jakoś ominąć ten wyjątek jeśli wskaźnik jest na NULL?

0
if (WW2 == NULL)
{
    printf("Pusto1");
}
else
{
    if (WW2->nazwisko)
    { 
        free((WW2)->nazwisko);
    }
    free(WW2);
}
0
sobek343s22 napisał(a):

Tylko program niestety musi mieć te "voidy" jest to zarzucone z góry , a da się jakoś ominąć ten wyjątek jeśli wskaźnik jest na NULL?

To na upartego można, Dodaj tylko sprawdzenie NULLA:

void * exampleInit(int elem) {
	 Example * obj = (Example * ) malloc(sizeof(Example));
	if (obj == NULL) {
		fprintf(stderr, "%s", "Example, constructor: Malloc failed!\n");
		abort();
	}
	obj->val = elem;
	return (void *)obj;
}


void clear2(void ** ptr) {
	if (ptr) {
		// uwolnienie innych zasobów wskazywanych przez ptr;
		free(*ptr);
		*ptr = NULL;
	}
	else 
		puts("Null pointer"); // albo stderr
}
0
struct MyStudent
{
    enum KIERUNEK kierunek;
    char *nazwisko;
    size_t rok;
};
typedef struct MyStudent *MyStudentRef;

MyStudentRef MyStudentCreate(const char *nazwisko, size_t rok, KIERUNEK kierunek)
{
     MyStudentRef r = malloc(sizeof(struct MyStudent));
     if (r) {
          r->nazwisko = strdup(nazwisko);
          r->rok = rok;
          r->kierunek = kierunek;
     }
     return r;
}

void MyStudentFree(MyStudentRef student)
{
     if (!student) return;
     free(student->nazwisko);
     free(student);
}

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