Подтвердить что ты не робот

Неверное чтение размера 8 - Valgrind + C

Valgrind сообщает об ошибке Invalid read of size 8 в следующем коде.

У меня есть объявленный массив,

struct symbol *st[PARSER_HASH_SIZE];

Когда моя программа инициализирована, все элементы в этом массиве инициализируются как 0.

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

Моя программа создает экземпляры struct symbol и вставляет в указанный массив в зависимости от хэш-значения. Таким образом, мало элементов из этого массива будет NULL, а другие будут действительными.

Следующий код пытается удалить выделенные элементы, и valgrind жалуется на строку, 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);
    }
}

Я пытаюсь понять причину этой ошибки.

Любая помощь будет замечательной!

4b9b3361

Ответ 1

Проблема в том, что вы освобождаете sym, а затем пытаетесь получить доступ к данным из (теперь освобожденных) данных: sym->next.

Вероятно, для внутреннего цикла вам понадобится нечто подобное:

struct symbol *next_sym = NULL;

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

Ответ 2

также неясно, будет ли ваш массив содержать структуры или указатели на структуры

struct symbol *st[PARSER_HASH_SIZE];

говорит о своем массиве указателей на структуры. Но тогда вы говорите

"Когда моя программа инициализирована, все элементы в этом массиве инициализируются как 0.

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

Это обрабатывает записи типа structs

чтобы очистить массив do

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