2011-07-26 54 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->data是指向record的指針,因此list->data[i]的類型爲record。您的所有問題行預計會出現char *或至少某種類型的指針,這會導致出現錯誤消息。

1

你的代碼好像是用list->data[i]爲指針,但由於list->datarecord*然後list->data[i]record,而不是一個record*

使用您當前的數據結構,只需要一個malloc/free對;除了list->data之外的所有東西都具有已知且恆定的長度。

現在你的realloc是錯的,你需要分配一個倍數sizeof (*list->data)(即sizeof (record))。如果第一次調用realloc返回null(你正在擺脫循環並試圖釋放list->data,這裏可能爲null),你的代碼也會失敗。

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

list->data具有類型record *,但你解決這個問題(與[list-nused]),使list->data[list->nused]類型是record,並分配一個指針。爲此,record_list中的data結構成員必須具有指向指針的指針。

此外,你想分配內存的字符串(因爲你分配strlen(lines) + 1字節)。但是你沒有任何變量來存儲字符串:record有一個int,一個float和兩個字符數組,它們有固定的大小。

你可能需要的是這樣的:

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,字符指針,浮動),並在該字符指針是,你的字符串分配內存。

+0

無法真正改變結構。有沒有其他的選擇? – user798774

+0

如果使用當前結構,則不需要爲字符串動態分配內存,而是已經擁有緩衝區(last和first)。然後你只需要做一個realloc(),不需要malloc(),並將該字符串複製到&list-> data [list-> nused ++]。 – Antti