編集1
Jonathan Lefflerによって示唆されるように、私は今、アンダースコアとも->
周りの削除スペースで始まる名前を使用していません。
________________________________________________________________________________アンロード()再帰CとSegfault(データベースのようなトライ)CS50のpset5
再帰関数を持つ構造体を解放しようとしたとき、私はセグメンテーションフォルトを取得しています。
//creating new trie data ctructure
typedef struct dict
{
bool is_word;
struct dict *children[ALPHABET+1];
}
node;
辞書を格納するために使用され、スペルチェッカで使用されます。
は、ここに私の構造体です。プログラムの最後に、割り当てられたすべてのメモリを解放する必要があります。
ここに私が書いた機能があります。それは自分自身を呼び出し、ピースごとに無料でトライする必要があります。しかし、それは私自身に何回か呼び出された後にセグメンテーションを与える。
bool unload(void)
{
// Check if root
if (temp == root)
{
for (int i = 0; i < ALPHABET+1; i++)
{
if (!temp->children[i] && i != ALPHABET)
{
}
else if (!temp->children[i] && i == ALPHABET)
{
free(temp);
return true;
}
else if(temp->children[i])
{
temp = temp->children[i];
unload();
}
}
}
else
{
for (int i = 0; i < ALPHABET+1; i++)
{
if (!temp->children[i] && i != ALPHABET)
{
}
else if (!temp->children[i] && i == ALPHABET)
{
temp1 = temp;
temp->children[i] = temp;
free(temp1);
return true;
}
else if (temp->children[i])
{
temp = temp->children[i];
unload();
}
}
}
return false;
}
root、temp、temp1がグローバルであるとします。それらのすべてはstruct _dictです。そして、関数が初めて呼び出された時、temp == root。
ようこそスタックオーバーフロー。 [About]ページと[Ask]ページをもう一度お読みください。さらに重要なことに、 MCVE([MCVE])の作成方法をお読みください。 ここでMCVEにとって重要な要件の1つは、問題を引き起こすコンパクトな入力値セットです。それは欠けているようだ。 –
アドバイスをいただきありがとうございます!今はもっと良いと思う? –
あなたのコードは、グローバル変数がなぜ悪い考えであり、逆効果をもたらすのかを実証しています。関数に解放されるノードを渡す必要があります。最初の呼び出しはルートノードを通過します。この関数は、グローバル変数にアクセスする必要はありません。 –