munmap_chunk(): Ungültiger Zeiger

Lesezeit: 2 Minuten

Benutzeravatar von delabania
delabania

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 es :

#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;
}

Das first() Funktion funktioniert einwandfrei, aber die second() (genau die free(out) ) erzeugt Fehler:

Fehler in `./a.out’: munmap_chunk(): ungültiger Zeiger: 0x0000000000400714 *** ababAborted (Core Dump)

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

  • Sie können einem Char-Array eine Zeichenfolge nicht direkt zuweisen, verwenden Sie strcpy(word, "ab").

    – gengisdave

    20. August 2015 um 12:46 Uhr

In der Funktion second()die Zuordnung word = "ab"; weist einen neuen Zeiger zu wordwobei der durch erhaltene Zeiger überschrieben wird malloc(). Wenn du anrufst free() auf den Zeiger später stürzt das Programm ab, weil Sie einen Zeiger auf übergeben free() das nicht durch erhalten wurde malloc().

Das Zuweisen von Zeichenfolgenliteralen hat nicht den Effekt, dass ihr Inhalt kopiert wird, wie Sie vielleicht gedacht haben. Verwenden Sie zum Kopieren des Inhalts eines Zeichenfolgenliterals strcpy():

strcpy(word, "ab");

  • Aber was genau bedeutet munmap_chunk()? Kann es einfach nicht segfault sein (da der an free übergebene Zeiger nicht an malloc() geht). Und was sind die anderen Szenarien, in denen das Problem mit dem ungültigen Zeiger von munmap_chunk() auftreten würde?

    – SatKetchum

    21. September 2021 um 5:39 Uhr

  • @SathvikSat munmap_chunk() ist eine interne Funktion der Speicherverwaltungsroutine der libc. Diese Fehlermeldung bedeutet, dass Sie durch das Schreiben in Speicher, der nicht zu einem Objekt gehört (aber zu Ihrem Prozess gehört, also kein Segfault), interne Datenstrukturen beschädigt haben, die zu diesen Routinen gehören. Beim Versuch, diese beschädigten Datenstrukturen zu verwenden, stürzen die internen Routinen ab.

    – fuz

    21. September 2021 um 8:01 Uhr

Benutzeravatar von ameyCU
ameyCU

In Funktion char * second

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

Die zweite Aussage word = "ab"; Änderungen word weg vom zugewiesenen Speicher zeigen. Sie kopieren die Zeichenfolge nicht "ab" auf den Bereich des Haufens, der von zugewiesen wurde malloc.

Und zu free ein Speicher, der nicht von zugewiesen wird malloc oder ähnliche Funktionen bringt Ihr Programm zum Absturz.

Der Versuch, einen ungültigen Zeiger freizugeben (ein Zeiger auf einen Speicherblock, der nicht von calloc, malloc oder realloc zugeordnet wurde), kann sich auf nachfolgende Zuordnungsanforderungen auswirken und Fehler verursachen.

Sie sollten hier verwenden strcpy wie auch von anderen vorgeschlagen.

1412650cookie-checkmunmap_chunk(): Ungültiger Zeiger

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy