【发布时间】:2023-04-07 12:05:02
【问题描述】:
我写了一个 C 程序来练习 DSA,特别是队列。
我编写了一个函数 free_q() 来释放动态分配的内存,但是当我打印指向这些结构的指针时,我得到的内存地址与打印 %p NULL 时不相等。我想知道为什么不仅释放动态时指针 Q 没有设置为 NULL。全部。结构体还有指向结构体内部数组的指针。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct queue_rec
{
unsigned int front;
unsigned int rear;
unsigned int max_size;
unsigned int size;
int *arr_struct;
};
typedef struct queue_rec *QUEUE;
int
isEmpty(QUEUE Q)
{
return(Q->size==0);
}
int isFull(QUEUE Q)
{
return(Q->size>=Q->max_size);
}
QUEUE
create_queue(unsigned int size)
{
QUEUE Q = (QUEUE) malloc(sizeof(struct queue_rec));
if(Q==NULL){printf("Out of space!");}
else
{
Q->arr_struct = (int *) malloc(size * sizeof(int));
if(Q->arr_struct == NULL){printf("Out of space!");}
else
{
Q->size = 0;
Q->front = 1;
Q->rear = 0;
Q->max_size = size;
}
}
return Q;
}
unsigned int
succ(unsigned int value, QUEUE Q)
{
if(++value==Q->max_size){value=0;}
return value;
}
void
enqueue(int data, QUEUE Q)
{
if(isFull(Q)){printf("Queue is full!");}
else
{
Q->size++;
Q->rear = succ(Q->rear, Q);
Q->arr_struct[Q->rear] = data;
}
}
void
dequeue(QUEUE Q)
{
if(isEmpty(Q)){printf("Queue is empty!");}
else
{
Q->size--;
printf("%d", Q->arr_struct[Q->front]);
Q->front = succ(Q->front,Q);
}
}
void
free_q(QUEUE Q)
{
free(Q->arr_struct);
free(Q);
Q = NULL;
}
int main()
{
QUEUE Q = create_queue(4);
free_q(Q);
printf("%p\c", Q);
printf("%p", NULL);
return 0;
}
输出:
00031480
00000000
【问题讨论】:
-
Q = NULL;函数参数在C语言中是按值传递的。这意味着Q是函数中的一个局部变量,设置它不会改变调用者的变量。 -
@kaylum gotchu,我将 free_q() 函数设置为获取指向 Q 指针的指针,所以我将 &Q 作为参数传递,它现在可以工作了。另一个困惑是,即使在我没有更改调用者的变量之前,我释放了它所指向的内容,那么即使我释放了它,为什么它仍然指向某个地址?因为,当我将指针分配给动态分配的内存时,我的空间不足,指针指向 NULL,那么为什么在释放它时,它没有将指针设置为 NULL??
-
使用valgrind
标签: c memory data-structures queue free