stdinからの行を格納し、その構造体に動的にメモリを割り当てる関数を記述しています。コードをコンパイルすると3つのエラーが発生し、なぜこれらのエラーが出るのかわかりません。次のように動的構造体に行を格納する
エラーは以下のとおりです。ここで
error: incompatible types in assignment
error: incompatible type for argument 1 of `strcpy'
error: incompatible type for argument 1 of `free'
は関数である。
#define NAMESIZE 20
#define BLOCK 2
typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;
typedef struct
{
int id;
name name;
float score;
}record;
typedef struct
{
record *data;
size_t nalloc;
size_t nused;
}record_list;
int list_insert(record_list *list, const record *rec)
{
char * temp;
char lines[512];
size_t i;
list->nalloc = 0;
list->nused = 0;
while(fgets(lines, 512, stdin))
{
if(list->nalloc == list->nused)
{
temp = realloc(list->data, (list->nalloc + BLOCK) * sizeof(char *));
if(temp == 0)
{
fprintf(stderr, "Unable to resize memory\n");
break;
}
list->data = (record *)temp;
list->nalloc += BLOCK;
}
list->data[list->nused] = malloc(strlen(lines) + 1); /*problem line*/
strcpy(list->data[list->nused++], lines);/*problem line*/
}
for(i = 0; i < list->nused; i++)
{
free(list->data[i]); /*problem line*/
}
free(list->data);
return 0;
}
任意の助けがappeciatedされるだろう。
本当に構造を変更することはできません。選択肢はありますか? – user798774
現在の構造体を使用する場合は、文字列に動的にメモリを割り当てる必要はありません。すでにバッファがあります(最後と最後)。次に、realloc()、malloc()を実行せずに文字列を&list-> data [list-> nused ++]にコピーします。 – Antti