ongeldige lees van maat 8 – Valgrind + C

Valgrind Rapporten Fout Invalid read of size 8in de volgende code.

Ik heb een array zoals,

struct symbol *st[PARSER_HASH_SIZE];

Wanneer mijn programma is geïnitialiseerd, zijn alle elementen in deze array ingesteld als 0.

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

Mijn programma maakt gevallen van struct symbolen voegt in de bovenstaande array, afhankelijk van de hash-waarde. Zo weinig van de elementen in deze array zullen null en anderen zijn geldige waarde.

De volgende code probeert de toegewezen items te verwijderen en Valgrind klaagt op de lijn,
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);
    }
}

Ik probeer de reden voor deze fout te begrijpen.

Elke hulp zou geweldig zijn!


Antwoord 1, Autoriteit 100%

Het probleem is dat u de symbevrijd, en vervolgens probeert toegang te krijgen tot een waarde van de (nu-vrijgegeven) gegevens: sym->next.

U wilt waarschijnlijk iets dergelijks voor de binnenlus:

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

Antwoord 2, Autoriteit 6%

Het is ook niet duidelijk of u array moet worden bedoeld om structuren of aanwijzers te bevatten om

te structureren

struct symbol *st[PARSER_HASH_SIZE];

zegt dat het een reeks verwijzingen naar structs is. Maar dan zeg je

“Als mijn programma wordt geïnitialiseerd, worden alle elementen in deze array als 0 gestart.”

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

Dit behandelt de items als structs

doe om de array te wissen

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

Other episodes