c - 免费(): invalid pointer at 2nd element

标签 c pointers malloc free

我得到一个

free(): invalid pointer:

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

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]);

还根据更改后的数据类型更改对 rows[i] 的所有引用。

关于c - 免费(): invalid pointer at 2nd element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33460988/

相关文章:

c - 当尝试在 Eclipse 上运行程序时,它崩溃了

比较子集的集合直到排列

c - 异常的 C 指针行为

c - 指向结构的指针和指向结构指针数组的指针。 C中的动态内存

c - 在结构中引用结构会生成 "incompatible-pointer-types"警告

java - 在不使用任何预定义函数的情况下从字母数字字符串中提取数值

C - 访问 malloc 内存后的 SIGSEGV

c - 使用 char 进行动态内存分配

c - 为什么在 malloc 调用中引用 undefined object 有效?

c - 修复 UART 溢出