繁体   English   中英

C calloc 和自由结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM