Неверное чтение размера 8 - Valgrind + C - PullRequest
21 голосов
/ 27 октября 2010

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);
    }
}

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

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

Ответы [ 2 ]

41 голосов
/ 27 октября 2010

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

Возможно, вы хотите что-то подобное для внутреннегоцикл:

struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym->next;
    free(sym);
    sym = next_sym;
}
3 голосов
/ 27 октября 2010

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

struct symbol *st[PARSER_HASH_SIZE];

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

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

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

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

для очистки массива сделайте

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