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);
嘿嘿, 我在为我的“数据库”
分配内存时遇到问题我有这个结构
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);