でそれを呼び出します。最初にpush
がない場合pop
と呼んでいる場合は、とは思わないでしょうか。は何ですか?
このビットは、私が神経質になります:
あなたは*stack
からprev
を設定し、何もprev
を以下のなかった場合、あなたはそれを解放します。 prev == *stack
以降、*stack
も解放されているため、ポインタはで無効になります。です。呼び出し元のポインタにアクセスしようとすると、未定義動作が呼び出されます。
リストの先頭をスタックの先頭にしているようです。
bool push(Node **l, int val)
{
Node *p = calloc(1, sizeof *p);
if (p)
{
p->v = val;
p->next = *l; // set p to point to the current head of the list
*l = p; // make p the new head of the list
}
return p != NULL; // will return false if the calloc (and by extenion,
} // the push operation) fails.
bool pop(Node **l, int *v)
{
Node *p = *l; // p points to head of list
if (!p)
return false;
*v = p->val; // get value in current node
*l = p->next; // make the next element the new list head
p->next = NULL; // sever the old list head
free(p); // and deallocate it
return true;
}
:私は今あなたがリストに
ヘッドスタックの先頭を作る場合、あなたのプッシュとポップは、以下のように見えるようにあなたの人生が
ずっとに簡単になりますことを伝えるつもりです
リストのトラバーサルがないため、現在および前のノードを追跡する必要はありません。あなたが気にするのはヘッドノードだけです。ステートメントp->next = NULL;
は、その後すぐにp
を解放するため、厳密には必要ありません。 がリストから削除されていることが明らかになったので、私はそれが好きです。しかし、サイクルをスペアしたくない場合は、省略することができます。p
編集
私はそのコード神経質であることが正しかったです。 *l
、あなたがスタックに正確に一つのアイテムを持っているとき、あなたはリストの先頭、を解放いますが、元のコードにリストポインタ(*stack
の値を更新しない - だからここ
は何が起こっているのか、基本的です最新の編集で)。 main
のstack
変数の値は変更されていません。現在はが無効です。 - そのアドレスのメモリは割り当てられなくなりました。したがって、次にpush
と呼ぶと、*l
はNULL
ではないとみなされ、(存在しない)リストを横断しようとします。
この時点での動作は未定義です。文字通り何かが起こる可能性があります。最初のpush
の後の私のシステムでは、stack
の値は0x501010
です。私はpop
を実行しますが、そのメモリはfree
ですが、stack
の値は変更されません。次のpush
では、*l
はNULL
ではないので、私は(*l)->next
をmalloc
が返すものに設定します。これは私の場合です...0x501010
を再度入力します。従って*l
は0x501010
であり、(*l)->next
は0x501010
である。別のアイテムをプッシュしようとすると、無限ループ(p
== p->next
)になります。この問題を解決するには
、あなたがfree
した後NULL
にそれをリストポインタを設定する必要があります。
Node *aux,*prev;
prev = *l;
aux = prev->next;
if(aux == NULL)
{
free(prev);
*l = NULL;
return;
}
に渡された値がNULL' –
'と等しい場合は、あなたが返すように機能を告げたので、それは何もしません@自己主張してください。 Btw私はその部分を削除してもまだ動作しません –
これはあなたの問題ではありませんが、なぜ 'prev-> v'と' aux-> v'で 'free'を呼びますか? 'v'メンバーは何かへのポインタとして宣言されていません。それに 'malloc'や' calloc'の結果を代入していますか? –