2017-12-03 4 views
0

Ich habe eine Struktur einer verknüpften Liste der einen Knoten Struktur haben innerhalbkostenlos eine Struktur einer verknüpften Liste, die struct Knoten haben

struct gradeNode { 
char courseName[sizeName]; 
int grade; 
struct gradeNode *next; 
struct gradeNode *prev; 

struct gradeList { 
struct gradeNode *head; 
struct gradeNode *next; 

Ich versuche, die Liste frei zu zerstören !! aber ich erhalte Ausnahme Zugriffsverletzung jede Hilfe

void destroyList(struct gradeList *head) 
{ 
    struct gradeNode* tmp; 

    while (head!= NULL) 
    { 
     tmp = head; 
     head = head->next; 

     free(tmp); 
    } 

    free(head); 
} 

Hier ist die Haupt

int i = 0; 
for (i; i < numOfStuds; i++) { 
    destroyList(&students[i].gradelist); 
} 
+0

'Studenten [i ] .gradenliste 'was ist der Typ? – coderredoc

+0

@coderredoc schüler ist array struct die have liste für jeden i die liste ist grabenliste typ – loay

+0

Sie rufen 'free' zweimal auf' head', in while loop und danach. – rafix07

Antwort

1
void destroyList(struct gradeList *head) 
{ 
    struct gradeNode* tmp; 

    while (head!= NULL) 
    { 
     tmp = head; //<<<<<<< assigning a struct gradeList* to a struct gradeNode* 
     head = head->next; 

     free(tmp); //<<<<<<< freeing the alias 
    } 

Sie zuweisen einen Zeiger von einem Typ in einen Zeiger eines anderen Typs und dann befreien sie, was besonders problematisch ist, da struct gradeList ein Mitglied von struct gradeNode zu sein scheint.

Überprüfen Sie Ihre Warnungen. Erhalten Sie keine Warnung für tmp = head? Mit gcc 7.2 erhalte ich:

[x86-64 gcc 7.2 # 1] Warnung: Initialisierung von inkompatiblen Zeigertyp [-Wincompatible-pointer-types]

https://godbolt.org/g/EWfLCn

Verwandte Themen