1. ホーム
  2. c

[解決済み】サイズ8の無効な読み取り - Valgrind + C

2022-02-04 15:41:35

質問

Valgrindがエラーを報告する Invalid read of size 8 を以下のコードに追加してください。

のような配列が宣言されていますね。

struct symbol *st[PARSER_HASH_SIZE];

私のプログラムが初期化されるとき、この配列のすべての要素は0としてinitailziedされます。

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

このエラーの理由を理解しようとしています。

何かお手伝いいただけると幸いです。

解決方法は?

を解放していることが問題なのです。 sym そして、その(今は解放されている)データから値にアクセスしようとします。 sym->next .

おそらく、このようなものが内部ループに必要なのでしょう。

struct symbol *next_sym = NULL;

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