質問: e; return ps; } /*--データ文字列から数値や文字列にデータ変換をし構造体にまとめて管理する関数--*/ void set_data_student(char *data[], struct student *seito[],int length) { char n[12]; int m,e,i; for(i=0;i
回答: CharStackのstkにアドレスを積んでいく構造のようですが、Push関数に渡している変数がmain関数で確保しているbuffer変数の先頭アドレス固定なので、積んだアドレスは全て同じ領域を指しています。 つまりファイルから読み込んだ最後の行が格納されているので、ポップしても全て同じ値が取得されます。 またPop関数で、data配列に積んだアドレスを格納しようとしているようですが、Pop関数側はダブルポインタにする必要があります。 今のままだと単にローカル変数を書き換えるだけなので、呼び出し元は変更されません。 これが原因で最後のset_data_studentで落ちていると思います。 以下の修正で落ちなくはなりますが、最初に挙げた問題があるので、そもそもの構成を見直す必要があります。 ``` //int Pop(CharStack *s, char *x) int Pop(CharStack *s, char **x) { if (s->ptr <= 0) /* スタックは空 */ return -1; //x = s->stk[--s->ptr]; *x = s->stk[--s->ptr]; return 0; } int main(void) { //~省略~ while(1) { //if(Pop(&s,data[j]) == -1) if(Pop(&s,&data[j]) == -1) { //~省略~ } ```