[解決済み】サイズ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;
}
関連
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み] テスト
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言