2015-11-01 66 views
1

無效指針我得到一個免費():在第二個元素

free(): invalid pointer:

試圖釋放

typedef struct { 
    int max_data; 
    int max_rows; 
    Address *rows; 
} Database; 

void Database_create(Connection *conn) { 
    conn->db->rows = malloc(sizeof(Address) * conn->db->max_rows); 
    int i = 0; 
    for (i = 0; i < conn->db->max_rows; i++) { 
     Address *rows = conn->db->rows; 
     rows[i] = *Address_create(i, 0); 
    } 
} 

void Database_destroy(Database *db) { 
    if (db) { 
     int i = 0; 
     for (i = 0; i < db->max_rows; i++) { 
      Address_destroy(&db->rows[i]); 
     } 
    } 
} 

Address *Address_create(int id, int set) { 
    Address *addr = malloc(sizeof(Address)); 
    addr->name = malloc(sizeof(char) * max_data); 
    addr->email = malloc(sizeof(char) * max_data); 
    addr->id = id; 
    addr->set = set; 
    return addr; 
} 

void Address_destroy(Address *addr) { 
    if (addr) { 
     if (addr->name) free(addr->name); 
     if (addr->email) free(addr->email); 
     free(addr); // ERROR HERE 
    } 
} 
+0

我的提示:刪除'rows [i] = * Address_create(i,0);'的開頭。 – Marian

+0

,使它不編譯時:錯誤:不兼容的類型時,分配類型'地址'類型'結構地址*' – Blitzkr1eg

+1

@Marian我同意你已經確定了代碼中的問題。但建議的變化還不夠(甚至不會編譯)。該結構還需要更改爲將行聲明爲「Address ** rows」。和整個代碼中的其他更改相匹配。 – kaylum

回答

3

在DB-分配>行(標//下面ERROR)第二個地址時,以下語句看起來不像一個有效的語句,它複製分配的指針的內容而不是分配的指針本身。

rows[i] = *Address_create(i, 0); 

您許多需要改變你的conn-> DB->行Adress **,然後分配內存的數據類型,如下

conn->db->rows = malloc(sizeof(Address *) * conn->db->max_rows); 

然後設置行[i]的

rows[i] = Address_create(i, 0); 

然後免費每一行如下

Address_destroy(db->rows[i]); 

還根據更改的數據類型更改對行[i]的所有引用。

+0

是的,我聲明不正確地址*行希望有一個指向地址的指針數組 – Blitzkr1eg

相關問題