回答編集履歴
2
説明変更
test
CHANGED
@@ -5,16 +5,18 @@
|
|
5
5
|
質問者の方は、こちらの文言を誤解しているように思います。(誤解を招く表現になっているのは確かなのですが)
|
6
6
|
|
7
7
|
出題者はおそらく、引数`l`の「次の」要素を削除する関数を書いて欲しいのだと思われます。
|
8
|
+
(頭のある連結リストの場合、先頭の接点は「頭」の次の接点となる)
|
8
9
|
|
9
|
-
それを誤解して`l`の指す要素そのものを削除する関数を書こうとした結果、引数の型を
|
10
|
+
それを誤解して`l`の指す要素そのものを削除する関数を書こうとした結果、引数の型を`list l`から`list* l`に変えざるを得なくなって、混乱を招いているように思います。
|
10
11
|
(こちらの方針でも書けないことはありませんが、難易度は上がります)
|
11
12
|
|
12
13
|
まずは素直に、`l`の「次の」要素を削除する関数`void delete(list l);`を書いてみてはいかがでしょうか。
|
13
14
|
|
14
15
|
---
|
15
|
-
なお、現状のコードで初回だけうまくいっているように見えるのは偶然にすぎません。
|
16
|
+
なお、現状のコードで、初回だけうまくいっているように見えるのは、偶然にすぎません。
|
16
17
|
|
17
18
|
`l=&n;`とすることで、引数として渡したポインタを書き換えようとしたのだと思いますが、これでは元のポインタは書き換わりません。
|
18
19
|
(`void f(int x) { x = 2; }`としても、引数として渡した変数が書き換わらないのと同じ)
|
19
20
|
|
20
|
-
その結果、`free(*l);`で解放された node がそのまま使われ続けることになります。
|
21
|
+
その結果、`free(*l);`で解放された node がそのまま使われ続けることになります。
|
22
|
+
解放済みメモリの使用は未定義動作なので、何が起こってもおかしくはありません。
|
1
表現の変更
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
出題者はおそらく、引数`l`の「次の」要素を削除する関数を書いて欲しいのだと思われます。
|
8
8
|
|
9
|
-
それを
|
9
|
+
それを誤解して`l`の指す要素そのものを削除する関数を書こうとした結果、引数の型を問題と異なる`list* l`にせざるを得なくなって、混乱を招いているように思います。
|
10
10
|
(こちらの方針でも書けないことはありませんが、難易度は上がります)
|
11
11
|
|
12
12
|
まずは素直に、`l`の「次の」要素を削除する関数`void delete(list l);`を書いてみてはいかがでしょうか。
|