Неверное чтение размера 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);
}
}
Я пытаюсь понять причину этой ошибки.
Любая помощь будет замечательной!
Ответы
Ответ 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;
}