回答編集履歴

1 追記

toki_td

toki_td score 2625

2018/06/25 22:33  投稿

Pushに渡しているxがmainのローカル変数とかではないですか?
stkは各要素をchar*で保存していてすべて同じ変数を示しているためxを書き換えれば要素の値も変わってしまいます。
stkのポインタのアドレスを見れば多分全部同じになっていると思います。
保存するときにmalloc & strcpy, またはstrdupでメモリを確保して文字列を別の領域にコピーしなければいけません。
いらなくなったとき(Popして値を使用し終わった後)のfreeもお忘れなく。
いらなくなったとき(Popして値を使用し終わった後)のfreeもお忘れなく。
### 追記
現状のコードだとwhileで繰り返す度にxは存在が消えるので大変危険なコードです。
一番簡単なのは
```C
Push(&s, strdup(x))
```
とすれば新しいバッファを確保して文字列をコピーして返してくれます。
Popで得たデータはスタックにはもう残っていませんから、帰ってきたものを使い終わったらfreeで開放します。
```C
char* p;
if (Pop(&s, &p) == -1)
   puts("\aエラ-:ポップに失敗しました。");
else { // <------------------------ ブロックで囲むこと
   printf("ポップしたデータは%sです。\n", p);
   //ポップしたデータを文字列と数値に変換
   sscanf(p,"%s%d%d",n,&m,&e);
   //構造体の配列に格納
   seito[i] = set_student(n,m,e);
   i++;
   free(p); // 必要なくなったので開放
}
```
あとTerminateでも開放が必要です。
```C
for(int i=0; i<s->ptr; i++)
   free(s->stk[i]);       // 残っている分を全て開放
free(s->stk);
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る