ページ 11

マロック関数

Posted: 2011年6月01日(水) 18:30
by TCP/IP
構造体と記憶領域の動的割り当てを用いてプログラムを作成するものとし、
入力された名前と点数の一覧表を求めるプログラムの宿題が学校で出たのですが、
うまくいきません。
コンパイルは正常に出来、実行もできるのですが
少し期待した動作とはずれています。

どこが間違っているのかアドバイス下さい。
プログラミング言語はC言語を使用しています。
下記にプログラムのソースを載せます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100

struct inf{
char *name;
int score;
};

char buff[MAXLEN + 1];

int main()
{
int n = 0, i = 0;
struct inf *sp, *sp_a;

printf("Please input the number student > ");
scanf("%d",&n);

sp = (struct inf *)malloc(sizeof(struct inf));
//if 後で入力
sp_a = sp;

for (i = 0; i < n; i++){
printf("Please input No.%d student's name > ",i);
scanf("%s",buff);

sp->name = (char *)malloc(sizeof(char) * (strlen(buff) + 1));
strcpy(sp->name,buff);

printf("Please input No.%d student's score >",i);
scanf("%d",&sp->score);
sp++;
}

sp = sp_a;

for(i = 0; i < n; i++){
printf("No\tname\tscore\t\n");
printf("%d\t%s\t%d\n", i, sp->name, sp->score);
sp++;
}

return 0;
}

実行結果は下記の通りになりました。

Please input the number student > 3
Please input No.0 student's name > A
Please input No.0 student's score >100
Please input No.1 student's name > B
Please input No.1 student's score >40
Please input No.2 student's name > C
Please input No.2 student's score >60
No name score
0 ? 100
No name score
1 ? 40
No name score
2 C 60

最後の生徒の名前は表示されますが、
他の生徒の名前は?となっています。
自分ではどこに問題があるのかがわかりませんので、
皆様の力をお貸し下さい。

Re: マロック関数

Posted: 2011年6月01日(水) 18:51
by ゆーずぃ
一行ずつデバッグしてみましたか?これくらいならステップ実行して変数の中身を見ていけばおかしな値が入る瞬間がすぐに見付かるはずです。
是非、やってみて下さい。

Re: マロック関数

Posted: 2011年6月01日(水) 18:51
by non
>sp = (struct inf *)malloc(sizeof(struct inf));
ここが1個分しかメモリを確保していないのが問題だと思われます。

Re: マロック関数

Posted: 2011年6月01日(水) 19:13
by naohiro19
freeしていないのも原因ですね。

Re: マロック関数

Posted: 2011年6月01日(水) 20:20
by 初級者
freeしていないことを原因に含むとは思えないのであります。

# mallocの読み方はマロック?何だか違和感がある。