calloc 为结构字段分配 0 个字节

calloc allocatin 0 bytes for a struct field

嘿嘿, 我在为我的“数据库”

分配内存时遇到问题

我有这个结构

typedef struct TPrvek {
    struct TPrvek *parent1;
    struct TPrvek *parent2;

    int id;//key

    char *name;//value
} TPrvek;

typedef struct Database {
    int size;
    struct TPrvek **TField;
} DATABASE;

我正在这样初始化:

void init(DATABASE *db) {
    DATABASE *newDb = (DATABASE *) malloc(sizeof(DATABASE));
    newDb->size = 1000;//initial capacity
    newDb->TField = (TPrvek **) calloc(newDb->size, sizeof(TPrvek *));
    for (int i = 0; i < db->size; i++) {
        newDb->TField[i] = NULL;
    }
    *db = *newDb;
}

但是当我尝试向它插入 smth 时,我正在写出分配的内存,我不知道如何修复它,甚至不知道哪里出了问题 插入片段:

    int addPerson(DATABASE *db,
                  int id,
                  const char *name,
                  int id1,
                  int id2) {
        //some checks to make sure ids are in bounds and field for new person is empty
    
        TPrvek *clovek = (TPrvek *) malloc(sizeof(TPrvek));
        
            clovek->name = (char *) malloc(sizeof(name) + 1);
            strcpy(clovek->name, name);
            clovek->id = id;
        
            //clovek->parent1 = (TPrvek *) malloc(sizeof(TPrvek));
            //clovek->parent2 = (TPrvek *) malloc(sizeof(TPrvek));I was desperate, this is wrong I think
        
            clovek->parent1 = db->TField[id1];
            clovek->parent2 = db->TField[id2]; 
        
            db->TField[id] = clovek;
//returns 1 if success
    }

主要是我有简单的断言来检查功能,例如:

int main(int argc,
         char *argv[]) {
    DATABASE a;     
    init(&a);
    assert (addPerson(&a, 1, "John", 0, 0) == 1);
    assert (addPerson(&a, 2, "Caroline", 0, 0) == 1);
...}

有什么想法吗? 我对 c 和一般的内存分配还很陌生,所以我很高兴能得到每一点帮助:)

这一行是问题所在(至少我马上就看到了一个):

clovek->name = (char *) malloc(sizeof(name) + 1);

name 的类型是 char *sizeof(char *) 是指针的大小 - 总是 8。 您需要的是字符串的长度,即:

clovek->name = (char *) malloc(strlen(name) + 1);