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;
}
お礼
プログラムはサンプルで資料のままなのですが; プロセス間通信で共有メモリを使用しています。 同じキーを作成して、共有メモリを新しくつくり、データを受け渡しするかんじです。 とりあえず問題点が間違いじゃなくてよかったです。 回答どうもありがとうございます。