次のコードでは、Cでポインタで実現される基本的な整数リンクリストを見ることができます。 新しいint-リストの前にあるval。 私はこれらの2つの機能は同等だと考えましたが、出力が示すとおり、そうではありません。C:リンクリスト - 関数 "insert first"が期待どおりに動作しない
#include <stdio.h>
#include <stdlib.h>
typedef struct _IntlistElem* Intlist;
typedef struct _IntlistElem {int val; Intlist next;} IntlistElem;
Intlist insertfirst(int val, Intlist list) {
Intlist new = malloc(sizeof(IntlistElem));
new->val = val;
new->next = list;
return new;
}
Intlist insertfirstAlternative(int val, Intlist list) {
IntlistElem new = {val, list};
Intlist head = &new;
return head;
}
void print(Intlist l){
while (l!=NULL){
printf("%d\n", l->val);
l = l->next;
}
printf("_____\n");
}
int main(){
Intlist ls = NULL;
ls = insertfirst(2, ls);
ls = insertfirst(1, ls);
print(ls);
Intlist lsAlt = NULL;
lsAlt = insertfirstAlternative(2, lsAlt);
lsAlt = insertfirstAlternative(1, lsAlt);
print(lsAlt);
return 0;
}
出力:
1
2
_____
1
1
...
私の質問は以下のとおりです。
1. はなぜ印刷機能が終了していませんか? (代替関数を呼び出した後)
2. これらの2つの「insertfirst」関数は、私が期待したものと同等ではないのはなぜですか?
これらの機能の違いは何ですか?
私はあなたの答えを楽しみにしています。 :)
デバッガを使用して、行単位でステップ実行する際に、コードフローと現在の変数値を検査する方法を緊急に学習する必要があります。 –
'Intlist head = &new;': 'new'はローカル自動変数です。有効範囲外です。 – BLUEPIXY
このコードは警告フラグとともにコンパイルされません(gccは-Wall -Werror -Wextraです)。私はあなたが次回それらを使用することをお勧めします。 – qleguennec