回答編集履歴

1

追記

2018/06/25 13:33

投稿

toki_td
toki_td

スコア2850

test CHANGED
@@ -9,3 +9,71 @@
9
9
  保存するときにmalloc & strcpy, またはstrdupでメモリを確保して文字列を別の領域にコピーしなければいけません。
10
10
 
11
11
  いらなくなったとき(Popして値を使用し終わった後)のfreeもお忘れなく。
12
+
13
+
14
+
15
+ ### 追記
16
+
17
+ 現状のコードだとwhileで繰り返す度にxは存在が消えるので大変危険なコードです。
18
+
19
+ 一番簡単なのは
20
+
21
+
22
+
23
+ ```C
24
+
25
+ Push(&s, strdup(x))
26
+
27
+ ```
28
+
29
+
30
+
31
+ とすれば新しいバッファを確保して文字列をコピーして返してくれます。
32
+
33
+ Popで得たデータはスタックにはもう残っていませんから、帰ってきたものを使い終わったらfreeで開放します。
34
+
35
+
36
+
37
+ ```C
38
+
39
+ char* p;
40
+
41
+ if (Pop(&s, &p) == -1)
42
+
43
+ puts("\aエラ-:ポップに失敗しました。");
44
+
45
+ else { // <------------------------ ブロックで囲むこと
46
+
47
+ printf("ポップしたデータは%sです。\n", p);
48
+
49
+ //ポップしたデータを文字列と数値に変換
50
+
51
+ sscanf(p,"%s%d%d",n,&m,&e);
52
+
53
+ //構造体の配列に格納
54
+
55
+ seito[i] = set_student(n,m,e);
56
+
57
+ i++;
58
+
59
+ free(p); // 必要なくなったので開放
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+
67
+ あとTerminateでも開放が必要です。
68
+
69
+
70
+
71
+ ```C
72
+
73
+ for(int i=0; i<s->ptr; i++)
74
+
75
+ free(s->stk[i]); // 残っている分を全て開放
76
+
77
+ free(s->stk);
78
+
79
+ ```