2016-07-27 11 views
-1

ich ein Problem habe, den Speicher mit einem Element einer Instanz einer Struktur zugeordnet Befreiung wie folgt definiert:Pointer-Fehler, wenn sie frei Strukturelement versucht

typedef struct WebPage { 
    char *url;        // url of the page 
    char *html;        // html code of the page 
    size_t html_len;       // length of html code 
    int depth;        // depth of crawl 
} WebPage; 

ich versuche, es zu befreien, mit:

static void setDestroy(set_t *set){ 

    pair_t *temp2; 

    if(set!=NULL&&set->head!=NULL){ 
    //store the head in a temporary pair 
    pair_t *temp = set->head; 
    //cycle through LL items, freeing contents and then structure instances 
    while(temp!=NULL){ 
     temp2 = temp->next; 
     free(temp->data->url); 
     free(temp->data->html); 
     free(temp->data); 
     free(temp->key); 
     free(temp); 
     temp = temp2; 
    } 
    set->head = NULL; 
    } 

    free(set); 
    return; 

} 

Allerdings bekomme ich diesen Fehler:

gcc -Wall -pedantic -std=c11 -ggdb -c -o crawler.o crawler.c 
crawler.c: In function ‘setDestroy’: 
crawler.c:428:22: warning: dereferencing ‘void *’ pointer 
     free(temp->data->url); 
        ^
crawler.c:428:22: error: request for member ‘url’ in something not a structure or union 
crawler.c:429:22: warning: dereferencing ‘void *’ pointer 
     free(temp->data->html); 
        ^
crawler.c:429:22: error: request for member ‘html’ in something not a structure or union 
<builtin>: recipe for target 'crawler.o' failed 

Alle Ideen, was ich falsch tun könnte? Ich habe versucht, temp-> data-> url als String ohne Erfolg zu werfen.

Vielen Dank!

+1

Was ist die Deklaration des Typs 'pair_t'? Es sieht so aus als wäre 'pair_t.data'' void * ', nicht' WebPage * '. – Barmar

+0

Oh, du hast recht, pair_t.data ist ungültig *. Also, wie könnte ich Daten vom Typ WebPage konvertieren? – dirtyb

Antwort

2

Wie die Fehlermeldung sagt, temp->data ist void*, so dass Sie temp->data->html und temp->data->url nicht verwenden können. Sie müssen es auf WebPage* umwandeln, um auf diese Mitglieder zuzugreifen.

free(((WebPage*)temp->data)->html); 
free(((WebPage*)temp->data)->url); 
Verwandte Themen