释放结构中的数组
Freeing an array within a struct
对于一项作业,我必须编写一个循环队列(我想你们中的大多数人都熟悉)。我制作了一个结构和一个使用动态内存初始化队列结构的函数。请注意,我在分配内存的结构中还有一个数组 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。免费(队列-> arr);免费(*队列-> arr);和免费(**队列-> arr);全部失败并生成相同的错误消息。
自由语句应类似于 free((*queue)->arr)
。
解释:queue_free
将 queue
变量定义为指向 queue_t
结构的指针。现在,为了获得指向结构的指针,您需要使用 (*queue)
删除一级间接寻址;然后你可以使用取消引用运算符 ->
来访问 arr
成员。
现在,其他选项对您不起作用的原因是:
free(queue -> arr)
- 指向 queue_t 结构的指针的指针没有 arr
成员
free(*queue -> arr)
- 取消引用运算符 ('*'
) 引用整个表达式,即 queue->arr
,这会将您带回到之前的错误
free(**queue -> arr)
- 同上
对于一项作业,我必须编写一个循环队列(我想你们中的大多数人都熟悉)。我制作了一个结构和一个使用动态内存初始化队列结构的函数。请注意,我在分配内存的结构中还有一个数组 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。免费(队列-> arr);免费(*队列-> arr);和免费(**队列-> arr);全部失败并生成相同的错误消息。
自由语句应类似于 free((*queue)->arr)
。
解释:queue_free
将 queue
变量定义为指向 queue_t
结构的指针。现在,为了获得指向结构的指针,您需要使用 (*queue)
删除一级间接寻址;然后你可以使用取消引用运算符 ->
来访问 arr
成员。
现在,其他选项对您不起作用的原因是:
free(queue -> arr)
- 指向 queue_t 结构的指针的指针没有arr
成员free(*queue -> arr)
- 取消引用运算符 ('*'
) 引用整个表达式,即queue->arr
,这会将您带回到之前的错误free(**queue -> arr)
- 同上