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



我得到一个

free():无效指针:

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

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
    }
}

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

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

您需要将conn->db->rows的数据类型更改为Adress **,然后按照分配内存

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

然后将行[i]设置为低于

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

然后释放下方的每一行

Address_destroy(db->rows[i]);

同时根据更改的数据类型更改对行[i]的所有引用。

相关内容

  • 没有找到相关文章

最新更新