[解決済み】ヒープ割り当てで初期化されていない値が作成された
2022-01-31 08:09:35
質問
ハッシュテーブルを使って単語の辞書を実装しようとしているので、それをグローバルにする必要があり、ヘッダーファイルの1つでそれを宣言しています。
extern node** dictionary;
ノードがある場所
typedef struct node
{
char* word;
struct node* next;
} node;
そして、関数が定義されている別のファイルに、辞書の宣言があるヘッダをインクルードし、さらに、一番上に
node** dictionary;
そして、実際に辞書を読み込む関数で、まずハッシュテーブルを構成するリンクリストのメモリを確保します。
bool load(const char* dict_file)
{
dictionary = malloc(sizeof(node*) * LISTS);
FILE* dict = fopen(dict_file, "r");
if(dict == NULL)
return false;
char buffer[MAX_LEN + 2];
size_dict = 0;
while(fgets(buffer, MAX_LEN + 2, dict) != NULL)
{
node* new_node = malloc(sizeof(node));
int len = strlen(buffer);
new_node->word = malloc(sizeof(char) * (len));
//avoid \n
for(int i = 0; i < len - 1; i++)
new_node->word[i] = buffer[i];
new_node->word[len - 1] = '\0';
new_node->next = NULL;
int index = hash(buffer);
new_node->next = dictionary[index];
dictionary[index] = new_node;
size_dict++;
}
if (ferror(dict))
{
fclose(dict);
return false;
}
fclose(dict);
return true;
}
そこで、プログラムは正常に動作し、文字列とノードに割り当てられたメモリをすべて解放して、valgrind(メモリリークを検出するデバッガ)を実行すると、メモリリークの可能性はないと言いますが、エラーが発生すると言います。
未使用の値がヒープ・アロケーションによって作成されました。
のメモリーを確保している行にリダイレクトされます。
dictionary
というのは、上に書いたload関数の最初の行と全く同じです。
何が間違っているのでしょうか?私は、私が使用する方法だと思います
dictionary
どなたか、このエラーを避けるために、グローバルに保つ他の方法を教えてください。
どのように解決するのですか?
更新されたコードでは、初期化されていないポインタが使用されています。
dictionary = malloc(sizeof(node*) * LISTS);
// .... code that does not change dictionary[i] for any i
new_node->next = dictionary[index]; // use uninitialized pointer
既に書かれているように、これは、すべてのポインタをあらかじめ
NULL
このループに入る前に
dictionary = malloc(sizeof(node*) * LISTS);
if ( !dictionary ) {
return false;
}
for (size_t i = 0; i < LISTS; ++i) {
dictionary[i] = NULL;
}
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC