Frage

Ich habe ein einfaches C-Programm, das einen Zeiger auf ein Zeichen-Array aufweist. So initiieren es, verwende ich malloc, und die Größe dann setzen sie x-mal später im Programm.

Wenn ich es die Größe einmal mit realloc, gdb zeigt keine Fehler, aber wenn ich die Formatfunktion versuchen Aufruf wieder, gdb zeigt die folgende Fehlermeldung:

warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )

Irgendwelche Ideen, warum es Ändern der Größe mehr als einmal diesen Fehler gibt?

Bearbeiten

Ich spielte mit ihm um, und es scheint der Fehler nicht passiert, wenn ich die Einstellung der Zeigerdaten auf Kommentar, die nach dem Ändern der Größe ist.

void setName(struct class_x *class, char *name)
{
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1);
    class->name = name;
}

void *reallocateMemory(void *member, size_t size)
{
    void *tmp = realloc(member, size);
    if(tmp == NULL)
    {
        //handle
    }
    return tmp;
}
War es hilfreich?

Lösung

class->name = name ist nicht zu tun, was Sie denken, es ist. Verwenden Sie strncpy() die Eingabezeichenfolge in die neu zugewiesenen Speicher zu kopieren. Dass Zuweisung Sie haben dort Ihre zugewiesenen Speicher undicht und den Zeiger zu überschreiben. Dann das nächste Mal setName() nennen, am Ende Sie realloc() mit einem Zeiger aufrufen, die Sie nicht aus malloc() bekommen haben. Ich erwarte, dass irgendwo, dass Sie setName() mit einem konstanten, globalen Variablen oder lokal Variable Zeichenfolge anrufen, und das ist, was schließlich den Fehler erzeugt. Wenn Sie immer nur setName() Aufruf wurden mit Strings, deren Speicher Sie von malloc() bekamen, würden Sie nicht die Warnung von GDB sehen (aber Sie würden immer noch die Fehler haben!).

Andere Tipps

führen Sie es unter valgrind oder Elektrozaun - diese Speicherüberschreitungen für Sie vor Ort wird

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top