プッシュ、ポップなどの基本的なスタック データ構造操作を実装する C コードを書いていました。スタックの Linked List 実装を使用しています。この実装では、スタックに値をプッシュするたびに、新しいノードを作成し、それをリンク リストのヘッド ノードとして設定します。したがって、これにはヘッド ノードの参照の変更が含まれます。
void push(stack **t, int ele)
{
stack *new, *temp;
temp=*t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=*t;
*t=new;
}
単一のポインタを使用して同様のコードを書くとしたら、次のようになります
void push(stack *t, int ele)
{
stack *new, *temp;
temp=t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=t;
t=new;
}
関数では、先頭ノード (**t) がすべてのステップで代入の RHS に表示されますが、これは
*t=new;
基本的に、最初のコードは 'new' を **t のポインター、つまり *t に割り当て、2 番目のコードは 'new' を *t のポインター、つまり t に割り当てます。どちらも、ヘッド ノードへの 1 つのポインターのみを「新規」として割り当てる必要があるように見えますが、最初のコードのみが機能し、2 番目のコードは実際にはヘッド ノードの値を変更しません。
これが起こる理由は何ですか?2 番目のコードが最初のコードと同じように機能しないのはなぜですか?