2013-12-14 4 views
5

Ich habe diesen Fehler mit dem folgenden Code:"Der Zeiger, der freigegeben wurde, wurde nicht zugewiesen." Fehler nach malloc, realloc

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(points); 
    free(points); 
    return 0; 
} 
void other_stuff(point points[]){ 
    //stuff 
    realloc(points, number*sizeof(point)) 
} 

ich gesucht habe, fand aber nur Beispiele, wo es war klar, dass es keine Zuordnung war.

Hier habe ich malloc verwendet, um points zu initialisieren, und änderte später seine Größe mit realloc; also wie ist der Zeiger "nicht zugeordnet" wenn ich zu free komme?

+0

'points' wird in' main' deklariert. Wie kann 'other_stuff' darauf zugreifen? – AVP

+0

@AVP sorry verpasste das. Bearbeitet in. (War in meinem Code) – OJFord

Antwort

8

realloc kann den Speicher an einen neuen Speicherort verschieben (wenn nicht genügend Platz zum Erweitern des alten Zeigers vorhanden ist). Wenn das passiert, müssen Sie den neuen Zeiger freigeben.

dieses zwicken Versuchen:

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(&points); 
    free(points); 
    return 0; 
} 
void other_stuff(point **points){ 
    //stuff 
    point *temp = realloc(*points, number*sizeof(point)); 
    if(temp != NULL) { 
     *points = temp; 
     // and do your stuff 
    } 
    else { 
     // panic? memory reallocation failed. Deal with it gracefully. 
    } 
} 

einen Griff-other_stuff Indem wir geben sie nicht nur über den Ort zu steuern, wo der Zeiger zeigt, sondern an die Adresse des Zeigers selbst. Dies ermöglicht es, den Speicher herum zu bewegen. Griffe sind eine gute Möglichkeit, Speicher dynamisch zu verwalten; aber konzeptionell ist ein Zeiger auf einen Zeiger gewöhnungsbedürftig ...

+0

-1 Wenn 'realloc' fehlschlägt, gehen Speicher verloren. Wenn Sie 'realloc' verwenden, weisen Sie zuerst eine temporäre Zuweisung zu und prüfen dann das Ergebnis. –

+0

@EdS Du hast Recht. Ich denke, meine Bearbeitung hat das behoben. – Floris

+0

Downvote entfernt. –

2

realloc gibt einen neuen Zeiger zurück. Das ist, was Sie benötigen, um (schließlich) freizugeben, wenn die Funktion erfolgreich war. Andernfalls ist es fehlgeschlagen, und Sie behalten den alten Zeiger für diesen Fall bei.

Wie realloc verwenden:

whataver *f = malloc(count * sizeof(*f)); 
/* ... */ 
whatever *temp = realloc(f, new_count * sizeof(*temp)); 
if (temp) 
    f = temp; // realloc worked, f is no longer valid/needed 
else 
    free(f); // error 

realloc kann den gleichen Zeiger zurückgeben, oder auch nicht. Der Punkt ist, dass Sie sich nicht mehr um den ursprünglichen Zeiger kümmern, wenn realloc erfolgreich war. Wenn es einen neuen Block zuordnen musste, ist der ursprüngliche Zeiger ungültig. Wenn dies nicht der Fall ist, gibt es den gleichen Zeiger zurück, und Sie möchten das nicht sofort aufheben.

+0

Sorry darüber, Punkte nicht lokal zu Haupt in Code, bearbeitet mein OP. – OJFord

+0

@OllieFord: Die Bearbeitung hat dieses Problem nicht behoben, aber was auch immer, es ist nicht wichtig. –

+0

Okay, wenn es funktioniert, muss es nie "frei" sein? – OJFord

Verwandte Themen