如何解决C calloc 和自由结构
#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 时,它会导致分段错误, 我认为是因为,虽然我用 calloc 将内存分配给了 d->pArray,大小为 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。