アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cを勉強中なのですが、以下のプログラムがうまくいきません。
(studentは構造体で定義した型です。)


iが0でない5の倍数の時にreallocでメモリを増やそうと思ったのですが、
「21行目」(reallocの行)で記述エラーを発見しました。
「lvalue」を付け忘れています。
と表示されます。

どこが間違っているのでしょうか?教えてくださいm(_ _)m


#include<stdio.h>

typedef struct{
char name[20];
int year;
char sex[6];
}student;


void read_data(int,student*);
void write_data(int,student*);

int main(void){
student data[5];
int i=0,j=0;

do{
read_data(i,data);
i++;
if(i%5==0 && i!=0){
data=realloc(data,(sizeof(student))*(i+5));
}
}while(data[i-1].year!=-1);

}
for(j=0;j<i-1;j++){
write_data(j,data);
}
free(heap);
return 0;
}

void read_data(int i,student *data){
printf("%d人目\n",i);
printf("名前?\n",i);
scanf("%s",(data[i].name));
printf("年齢?\n",i);
scanf("%d",&(data[i].year));
printf("性別?\n",i);
scanf("%s",(data[i].sex));
return;
}
void write_data(int j,student *data){
printf("%d人目\t",j+1);
printf("名前:%s\n",data[j].name);
printf("年:%d\n",data[j].year);
printf("性:%s\n",data[j].sex);
return;
}

A 回答 (2件)

reallocはmallocやcallocで確保した領域を拡張するときに使うものです。


配列は拡張できません。
配列自体に = で代入することもできません

> 「lvalue」を付け忘れています。
わからないなら、エラーは正確に書きましょう。
「lvalue required as left operand of assignment」とかじゃないですか?
配列dataは代入や変更のできない右辺値(rvalue)で、代入や変更のできるlvalue(左辺値)ではない、ということです。


あと、{}の数間違えてませんか?
free(heap); も heapなんて変数は使われてませんが
    • good
    • 5

realloc()の使い方で…よくやるミスになりそ~な気もするので注意しましょう。


配列ではなくポインタでやるように変更した後…になりますが。

realloc()が失敗したらどうなるか。
という点で注意が必要です。
「realloc 失敗」で検索すれば見つかるでしょう。


ちなみに、リンクリストという方法もあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!