Ungültiges Lesen von Größe 8 – Valgrind + C

Lesezeit: 2 Minuten

Valgrind meldet Fehler Invalid read of size 8 im folgenden Code.

Ich habe ein Array wie deklariert,

struct symbol *st[PARSER_HASH_SIZE];

Wenn mein Programm initialisiert wird, werden alle Elemente in diesem Array als 0 initialisiert.

memset(&st[0], 0, sizeof(st));

Mein Programm erstellt Instanzen von struct symbol und fügt abhängig vom Hashwert in das obige Array ein. So wenige der Elemente in diesem Array sind NULL und andere sind gültige Werte.

Der folgende Code versucht, die zugewiesenen Elemente zu löschen, und Valgrind beschwert sich an der Zeile,
sym = st[i]; sym != NULL; sym = sym->next

struct symbol *sym = NULL;

/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
    for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
        free(sym);
    }
}

Ich versuche, den Grund für diesen Fehler zu verstehen.

Jede Hilfe wäre toll!

Das Problem ist, dass Sie das befreien symund versuchen Sie dann, auf einen Wert aus den (jetzt befreiten) Daten zuzugreifen: sym->next.

Sie möchten wahrscheinlich so etwas für die innere Schleife:

struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym->next;
    free(sym);
    sym = next_sym;
}

Benutzer-Avatar
pm100

Es ist auch nicht klar, ob Ihr Array Strukturen oder Zeiger auf Strukturen enthalten soll

struct symbol *st[PARSER_HASH_SIZE];

sagt, es ist ein Array von Zeigern auf Strukturen. Aber dann sagst du

“Wenn mein Programm initialisiert wird, werden alle Elemente in diesem Array als 0 initialisiert.”

memset(&st[0], 0, sizeof(st));

Dies behandelt die Einträge wie Strukturen

um das Array zu löschen tun

for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}

  • Es soll Zeiger auf Strukturen enthalten. Kannst du mir sagen, wie man es richtig initialisiert?

    – Navaneeth KN

    27. Oktober 2010 um 17:18 Uhr

  • Warum nicht einfach struct symbol *st[PARSER_HASH_SIZE] = {0};?

    – Saphir_Ziegel

    30. Juli 2020 um 22:31 Uhr

1364760cookie-checkUngültiges Lesen von Größe 8 – Valgrind + C

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

Privacy policy