- ベストアンサー
reallocでうまくメモリを拡張出来ていない?気がしますが・・・
OS:WindowsXP SP3 コンパイラ:Visual C++ 2008Express Edition with Service Pack 1 質問なんですが、 ttp://homepage3.nifty.com/mmgames/c_guide/ ↑こちらの練習問題19の3-1なんですが、4人以上のデータを入力して showdata関数で表示させると4人目からのデータが入力したデータと 違います。 (reallocのところが間違っているような気がするのですが?です) どなたかアドバイスお願いします。 他の問題点も良ければアドバイス頂けると幸いです。 *******************以下自分で書いたソース******************** #include <stdio.h> #include <stdlib.h> //構造体 typedef struct { char name[64]; int age; int sex; } stat; //プロトタイプ宣言 int status(stat * ,int *); void showdata(stat *, int); int main() { int cnt, max = 3; //構造体ポインタの宣言 stat *data; //動的配列の宣言 data = (stat *)malloc(sizeof(stat) * max); if ( data == NULL ) { exit(0); } //入力用関数の呼び出し cnt = status(data, &max); //出力用関数の呼び出し showdata(data, cnt); //メモリの開放 free(data); return 0; } int status(stat *data, int *max) { int i = 0; //年齢に-1が入力されるまでループ do { if ( (i + 1) > (*max) ) { *max += 10; data = (stat *)realloc(data, sizeof(stat) * (*max) ); if ( data == NULL ) { exit(0); } } printf("名前入力:"); scanf("%63s", data[i].name); getchar(); fflush(stdin); printf("年齢入力(-1入力で入力終了):"); scanf("%d", &data[i].age); getchar(); //1か2でない場合再入力 do { printf("性別を入力(1.男性 2.女性) <1 or 2>:"); scanf("%d", &data[i].sex); getchar(); if ( (data[i].sex < 1) || (data[i].sex > 2) ) { data[i].sex = 3; printf("1か2で入力してください\n"); } } while ( (data[i].sex) == 3 ); i++; } while ( (data[i-1].age) != -1 ); return i - 1; } void showdata(stat *data, int cnt) { int i; for ( i = 0; i < cnt; i++ ) { printf("\n%d人目のデータ\n", i + 1); printf("名前:%s\n", data[i].name); printf("年齢:%d\n", data[i].age); if ( data[i].sex == 1 ) { printf("性別:男性\n"); } else { printf("性別:女性\n"); } } return; }
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (8)
- S117
- ベストアンサー率40% (18/45)
- asuncion
- ベストアンサー率33% (2127/6289)
- chie65536(@chie65535)
- ベストアンサー率44% (8718/19798)
- Tacosan
- ベストアンサー率23% (3656/15482)
- php504
- ベストアンサー率42% (926/2160)
- Tacosan
- ベストアンサー率23% (3656/15482)
- Wr5
- ベストアンサー率53% (2173/4061)
- Wr5
- ベストアンサー率53% (2173/4061)
お礼
こちらで質問してから何度か挫折しそうになりましたが みなさんのおかげで解決することが出来ました。 ありがとうございました。 これからも質問することがあると思うのでまたよろしくお願いします。 (ここに出来上がったソースを貼り付けようとしたんですが、文字数が多い!と怒られました。)
補足
ありがとうございます。 >int func(int a*) { >*a = 10; >} >int main(void) { >int a = 0; >func(&a); >printf("%d", a); //10 >} >このコードは読めますよね? 大体分かるんですがint func(int a*)が分かりません。 a*というやり方は初めて見ました。それとなぜvoidでなくintなのかも 分かりません・・・。 >重要なのは、書き換えたい変数の型と、関数に渡す型の関係です。 >int型の変数を書き換えたいのでint*型の値を渡しています。 >一般化すれば、 >「T型の変数を呼び出し先の関数で書き換えたいとき、渡すべき値はT*型となる。」 >ということになります。 >そして今回はTがstat*なので、渡すべき型はstat**なのです。 >どういうポインタを使えばいいのか悩む必要はありません。型をみればすぐにわかります。 すごく分かりやすく説明してくれていて大変参考になりました。 ありがとうございます。