[英]C calloc and free struct
#define UNIT_ARRAY_SIZE 1024
struct UserInfo {
char *name;
char *id;
int purchase;
};
struct DB {
struct UserInfo *pArray;
int curArrSize;
int numItems;
};
DB_T CreateCustomerDB(void) {
DB_T d;
d = (DB_T) calloc(1, sizeof(struct DB));
if (d == NULL) {
fprintf(stderr, "Can't allocate a memory for DB_T\n");
return NULL;
}
d->curArrSize = UNIT_ARRAY_SIZE; // start with 1024 elements
d->pArray = (struct UserInfo *)calloc(d->curArrSize,
sizeof(struct UserInfo));
if (d->pArray == NULL) {
fprintf(stderr, "Can't allocate a memory for array of size %d\n",
d->curArrSize);
free(d);
return NULL;
}
return d;
}
void
DestroyCustomerDB(DB_T d)
{
if (d == NULL) return;
struct UserInfo *p;
struct UserInfo *nextp;
for (p = d->pArray; p != NULL; p = nextp) {
nextp = p + 1;
free(p->id);
free(p->name);
}
free(d->pArray);
free(d);
}
当我测试 DestoryCustomerDB 时,它会导致分段错误,我认为这是因为,虽然我将 memory 分配给了 d->pArray 和 calloc,大小为 d->curArrsize,但 DestoryCustomerDB 中的 for 循环永远迭代。 为什么会这样?
我是否正确释放? 谢谢,
for (p = d->pArray; p;= NULL; p = nextp) {
可能会失败,因为没有确定p == NULL
。
而是迭代到curArrSize
。
while (d->curArrSize > 0) {
struct UserInfo *p = d->pArray[--(d->curArrSize)];
free(p->id);
free(p->name);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.