2014-03-12 8 views
5

Dies kann ein Neuling Fehler sein, aber ich bin dankbar für alle Tipps, was genau ich falsch mache.Korrekte free() von String-Array C

Der Code:

int main() 
{ 
    int i =0; 
    char ** nameslist; 
    nameslist = malloc(5 * sizeof(char*)); 

    for (i=0; i <5; i++) 
    { 
     nameslist[i]=malloc((20+1)*sizeof(char)); 
    } 

    nameslist[0]="John"; 
    nameslist[1]="Adam"; 
    nameslist[2]="Nick"; 
    nameslist[3]="Joe"; 
    nameslist[4]="Peter"; 

    for (i=0; i <5; i++) 
    { 
    free(nameslist[i]); 
    } 

    free(nameslist); 
    return 0; 
} 

Valgrind verwenden, sehe ich immer noch, dass ich Speicherlecks im Heap haben - wie behebe ich dieses Problem? Ich vermute, dass ich zu viel Platz malloc - aber immer noch, wie gehe ich über Freiraum, den ich nicht notwendig brauche?

Vielen Dank für Hinweise!

Antwort

7

Das Problem ist das, wenn du das schreibst:

nameslist[0]="John"; 

Sie verwenden nicht den Speicher, den Sie zugewiesen haben. "John" ist selbst ein Zeiger und Sie überschreiben die Adresse, die von malloc mit diesem neuen Zeiger zurückgegeben wird. Verwenden Sie die Funktion strncpy(), um die Zeichenfolge in den von Ihnen zugewiesenen Speicher zu kopieren.

+1

+1 Aufruf 'frei' auf den Konstanten ist wahrscheinlich auch keine gute Idee, die dies auch behebt. –

6

Ihre malloc und free Zeug ist in Ordnung, aber Sie sind die Original-Zeichenkette verwaisen, wenn Sie versuchen Zuordnung wie dies zu tun:

nameslist[0]="John"; 

Stattdessen sollten Sie strcpy verwenden:

strcpy(nameslist[0], "John");