2015-08-20 9 views
13

Ich habe den Fehler in meinem Programm entdeckt und beschlossen, einen einfachen zu schreiben, der mir helfen würde zu verstehen, was vor sich geht. Hier ist sie:munmap_chunk(): ungültiger Zeiger

#include <stdio.h> 
#include <stdlib.h> 

char * first() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word[0] = 'a'; 
    word[1] = 'b'; 
    word[2] = '\0'; 
    return word; 
} 

char * second() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word = "ab"; 
    return word; 
} 

int main() 
{ 
    char * out = first(); 
    printf("%s", out); 
    free(out); 
    out = second(); 
    printf("%s", out); 
    free(out); 
    return 0; 
} 

Die first() Funktion ordnungsgemäß funktioniert, aber der second() (genau der free(out)) genarates Fehler:

Error in `./a.out': munmap_chunk(): invalid pointer: 0x0000000000400714 *** ababAborted (core dumped)

Ich verstehe nicht, warum die erste Funktion ist richtig, aber die Das zweite ist nicht. Könnte jemand erklären warum?

+2

Sie können einem char-Array nicht direkt einen String zuweisen, verwenden Sie 'strcpy (word," ab ")'. – gengisdave

Antwort

20

In der Funktion second() ordnet das Zuordnungs word = "ab"; einen neuen Zeiger auf word, um den Zeiger durch malloc() erhalten überschrieben wird. Wenn Sie später auf dem Zeiger free() aufrufen, stürzt das Programm ab, da Sie einen Zeiger an free() übergeben, das nicht über malloc() abgerufen worden ist.

Das Zuweisen von Zeichenfolgenliteralen hat nicht den Effekt, dass sie ihren Inhalt kopieren, wie Sie vielleicht gedacht haben. Um den Inhalt eines Zeichenfolgenliterals zu kopieren, verwenden strcpy():

strcpy(word, "ab"); 
7

In funxtion char * second -

char * word = malloc(sizeof(char) * 10); 
word = "ab"; 

Die zweite Anweisung word = "ab";word ändert weg Punkt von der zugeordneten memory.You kopieren nicht die Zeichenfolge "ab" in den Bereich der Heap von malloc zugewiesen zugeordnet.

Und free ein Speicher nicht von malloc oder ähnliche Funktionen zugewiesen stürzt Ihr Programm ab.

Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.

Sie sollten hier strcpy verwenden, wie auch von anderen vorgeschlagen.

Verwandte Themen