2011-07-26 17 views
0

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されるだろう。

答えて

1

list->datarecordへのポインタなので、list->data[i]recordです。すべての問題行には、char *または少なくとも何らかのポインタが必要であり、その結果、エラーメッセージが表示されます。

1

コードはポインタとしてlist->data[i]を使用しているように見えるが、list->datarecord*あるので、その後、list->data[i]record、ないrecord*です。あなたの現在のデータ構造を持つ

、一つだけのmalloc /無料のペアが必要とされています。 list->data以外のものはすべて既知で一定の長さです。

今、あなたのreallocは本当に間違っている、あなたはsizeof (*list->data)(すなわちsizeof (record))の複数を割り当てる必要があります。 reallocへの最初の呼び出しがnullを返す場合(ループを中断して、ここでnullの可能性があるlist->dataを解放しようとすると)コードも失敗します。

1
list->data[list->nused] = malloc(strlen(lines) + 1); 

list->datarecord *を入力していますが、([list-nused]で)それを解決する、list->data[list->nused]のタイプはrecordになるように、そしてあなたはそれへのポインタを割り当てています。これが機能するには、record_listdata構造体メンバがポインタへのポインタである必要があります。

はまた、あなたは(あなたがstrlen(lines) + 1バイトを割り当てるため)の文字列にメモリを割り当てることにしたいです。しかし、文字列を格納する変数はありません。recordは、固定サイズのint、float、および2文字の配列を持ちます。あなたはおそらく欲しい

は次のようなものです:

typedef struct { 
    int id; 
    char *name; 
    float score; 
} record; 

... 
temp = realloc(list->data, list->nalloc * sizeof(record)); 
... 
list->data[list->nused].name = malloc(strlen(lines) + 1); 
strcpy(list->data[list->nused++].name, lines); 
... 
free(list->data[i].name); 

だから、レコード(int型、char型のポインタ、フロート)を割り当てると、char型のポインタを使用すると、文字列のメモリを割り当て、です。

+0

本当に構造を変更することはできません。選択肢はありますか? – user798774

+0

現在の構造体を使用する場合は、文字列に動的にメモリを割り当てる必要はありません。すでにバッファがあります(最後と最後)。次に、realloc()、malloc()を実行せずに文字列を&list-> data [list-> nused ++]にコピーします。 – Antti

関連する問題