質問: 0; j < NUM; j++) { printf("番号:%d\n", s_rt[j]->number); printf("名前:%s\n", s_rt[j]->name); printf("英語の点数:%d\n", s_rt[j]->english); } return 0; } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど) 1番目の番号を入力してください:1 1番目の名前を入力してください:a 1番目の英語の点数を入力してください:1 2番目の番号を入力してください:4 2番目の名前を入力してください:b 2番目の英語の点数を入力してください:2 3番目の番号を入力してください:5 3番目の名前を入力してください:c 3番目の英語の点数を入力してください:3 番号:-572662307 名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン 英語の点数:-572662307 番号:-572662307 名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン 英語の点数:-572662307 番号:-572662307 名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン・ン 英語の点数:-572662307 文字化けが起きてしまう
回答: 気になった所:struct result *s_rt[NUM];の後の処理はループの中に入れましょう。また、free(s_rt);では、メモリの開放は出来ません。個別(free(s_rt[0]);)にしましょう。 「追記」ほぼ完成してるようなので、参考までに。 ``` #include #include // #define NUM 3 #define NUM1 20 // struct result { int number; char name[NUM1]; int english; }; // int main(void) { struct result *s_rt[NUM]; for (int i = 0; i < NUM; i++) { s_rt[i] = (struct result *)malloc(sizeof(struct result)); if (s_rt[i] == NULL) { printf("メモリの動的確保に失敗しました\n"); if (i != 0) { for (int j = 0; j < i; j++) { free(s_rt[j]); } } exit(1); } else { printf("%d番目の番号を入力してください:", i + 1); scanf("%d", &s_rt[i]->number); printf("%d番目の名前を入力してください:", i + 1); scanf("%s", s_rt[i]->name); printf("%d番目の英語の点数を入力してください:", i + 1); scanf("%d", &s_rt[i]->english); } } // int j; for (int i = 0; i < NUM; i++) { printf("番号:%d\n", s_rt[i]->number); printf("名前:%s\n", s_rt[i]->name); printf("英語の点数:%d\n", s_rt[i]->english); free(s_rt[i]); } putchar('\n'); return 0; } ``` 結果 ``` usr ~/Project/test/teratail % ./a.out 1番目の番号を入力してください:2 1番目の名前を入力してください:aaa 1番目の英語の点数を入力してください:123 2番目の番号を入力してください:4 2番目の名前を入力してください:bbbbbbbb 2番目の英語の点数を入力してください:456 3番目の番号を入力してください:5 3番目の名前を入力してください:dd 3番目の英語の点数を入力してください:789 番号:2 名前:aaa 英語の点数:123 番号:4 名前:bbbbbbbb 英語の点数:456 番号:5 名前:dd 英語の点数:789 usr ~/Project/test/teratail % ```