释放结构中的数组

时间:2015-04-01 17:05:21

标签: c arrays struct malloc free

对于作业我必须写一个循环队列(我想大多数人都熟悉)。我创建了一个结构和一个使用动态内存初始化队列结构的函数。请注意,我在分配内存的结构中也有一个数组 arr

出于某种原因,我似乎无法从内存中释放我的数组。

struct queue {
  element_t *arr;    // dynamic array containing data elements
  int current_size;   // Counts number of elements in the queue
  int front, rear;   // Remark for later: extra fields need to be added here to make it a thread-safe queue as needed for the assigment
};


queue_t* queue_create(){
  struct queue *queue = malloc(sizeof(struct queue));

  if(queue == 0){  //check if memory available
    printf("Out of memory\n");
    return NULL;
  }

  queue -> current_size = 0;
  queue -> front = -1;
  queue -> rear = -1;
  queue -> arr = malloc(QUEUE_SIZE*sizeof(element_t));
  return queue;
}

当我使用函数queue_free完成它时,我正试图释放内存。该函数接受一个指向队列的双指针(赋值的一部分)。

void queue_free(queue_t** queue){
  free(**queue -> arr);
  free(*queue);
}

当我调用最后一个函数时,我收到一条错误消息:

queue.c: In function ‘queue_free’:
queue.c:39:16: error: request for member ‘arr’ in something not a structure or union
   free(**queue -> arr);
                ^

我已经用valgrind检查了泄漏情况。队列被正确释放但由于某种原因我无法得到我的数组的地址。

提前致谢

P.S。 free(queue - > arr); free(* queue - > arr);并且免费(**队列 - > arr);全部失败并生成相同的错误消息。

1 个答案:

答案 0 :(得分:1)

免费声明应该像free((*queue)->arr)

说明:queue_freequeue变量定义为指向queue_t结构的指针。现在,为了获得指向结构的指针,您需要使用(*queue)删除一个间接级别;然后,您可以使用取消引用运算符->来访问arr成员。

现在,其他选项对你不起作用的原因是:

  • free(queue -> arr) - 指向queue_t结构指针的指针没有arr成员
  • free(*queue -> arr) - 取消引用运算符('*')引用整个表达式,即queue->arr,它会将您带回上一个错误
  • free(**queue -> arr) - 与上述相同