C free():第二个元素处的指针无效

C free():第二个元素处的指针无效,c,pointers,malloc,free,C,Pointers,Malloc,Free,我得到一份工作 free():无效指针: 尝试释放在db->行中分配的第二个地址时(下面标记//错误) typedef结构{ int max_数据; int max_行; 地址*行; }数据库; 创建无效数据库(连接*conn){ conn->db->rows=malloc(sizeof(地址)*conn->db->max_行); int i=0; 对于(i=0;idb->max_rows;i++){ 地址*行=连接->数据库->行; 行[i]=*地址\u创建(i,0); } } 无效数据库\u

我得到一份工作

free():无效指针:

尝试释放在db->行中分配的第二个地址时(下面标记//错误)

typedef结构{
int max_数据;
int max_行;
地址*行;
}数据库;
创建无效数据库(连接*conn){
conn->db->rows=malloc(sizeof(地址)*conn->db->max_行);
int i=0;
对于(i=0;idb->max_rows;i++){
地址*行=连接->数据库->行;
行[i]=*地址\u创建(i,0);
}
}
无效数据库\u销毁(数据库*db){
中频(db){
int i=0;
对于(i=0;imax_行;i++){
地址_销毁(&db->行[i]);
}
}
}
地址*创建地址(整数id,整数集){
地址*addr=malloc(sizeof(地址));
地址->名称=malloc(大小(字符)*最大数据);
地址->电子邮件=malloc(大小(字符)*最大数据);
地址->id=id;
地址->设置=设置;
返回地址;
}
无效地址(地址*地址){
如果(地址){
如果(地址->名称)自由(地址->名称);
如果(地址->电子邮件)免费(地址->电子邮件);
free(addr);//此处出错
}
}

以下语句看起来不是有效语句,它复制的是已分配指针的内容,而不是已分配指针本身

rows[i] = *Address_create(i, 0);
您需要将conn->db->行的数据类型更改为
address**
,然后按如下方式分配内存

conn->db->rows = malloc(sizeof(Address *) * conn->db->max_rows);
然后按如下所示设置行[i]

rows[i] = Address_create(i, 0);
然后按如下方式释放每一行

Address_destroy(db->rows[i]);

还可以根据更改的数据类型更改对行[i]的所有引用。

我的提示:删除
rows[i]=*Address\u create(i,0)中的开头。这使得它无法编译:错误:从类型“struct Address*”分配给类型“Address”时类型不兼容@Marian我同意您已在代码中识别出问题。但是建议的更改是不够的(它甚至不会编译)。该结构还需要更改,以将
声明为
地址**行
。以及整个代码中的其他更改以匹配该更改。因为
&db->rows[i]
不是指向
malloc
分配的内存块开头的指针。是的,我声明了不正确的地址*行,希望有一个指向地址的指针数组
Address_destroy(db->rows[i]);