質問: ``` ### 試したこと Pushを二回行い、スタック内を確認したら問題が発生したので、Pushの関数かmain関数の変数に問題があるのかもしれないということがわかった。 ### 補足情報(FW/ツールのバージョンなど) visual C++ 2010
回答: Pushに渡しているxがmainのローカル変数とかではないですか? stkは各要素をchar*で保存していてすべて同じ変数を示しているためxを書き換えれば要素の値も変わってしまいます。 stkのポインタのアドレスを見れば多分全部同じになっていると思います。 保存するときにmalloc & strcpy, またはstrdupでメモリを確保して文字列を別の領域にコピーしなければいけません。 いらなくなったとき(Popして値を使用し終わった後)のfreeもお忘れなく。 ### 追記 現状のコードだとwhileで繰り返す度にxは存在が消えるので大変危険なコードです。 一番簡単なのは ``` Push(&s, strdup(x)) ``` とすれば新しいバッファを確保して文字列をコピーして返してくれます。 Popで得たデータはスタックにはもう残っていませんから、帰ってきたものを使い終わったらfreeで開放します。 ``` 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でも開放が必要です。 ``` for(int i=0; iptr; i++) free(s->stk[i]); // 残っている分を全て開放 free(s->stk); ```