C中动态分配的结构指针和静态分配的结构指针之间有区别吗?
Is there a difference between dynamically allocated pointer to structure and statically allocated pointer to structure in C?
我正在练习队列,当我尝试创建一个这样的队列时
struct queue
{
struct node *front;
struct node *rear;
};
struct queue *q;
以及创建队列的函数
void create_queue(struct queue *q)
{
q -> rear = NULL;
q -> front = NULL;
}
它在运行时失败了,但是当我在函数内部动态分配指向队列的指针时
有效。
像这样
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
}
此代码:
struct queue
{
struct node *front;
struct node *rear;
};
struct queue *q;
创建指向 struct queue
的 NULL
指针。它 不 分配此结构的实例(与动态分配内存的代码不同)。
所以当你在这个 NULL
指针上调用 create_queue()
时,你(自然地)得到 SIGSEGV
.
要静态分配 struct queue
的实例,请执行以下操作:
struct queue q;
然后你可以用create_queue(&q)
初始化它。
P.S。静态分配的 struct queue
已经被零初始化,因此在该实例上调用 create_queue()
实际上是空操作。
在这个函数中
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
}
您并没有像您所说的那样动态分配指针。指针q是函数的局部变量,退出函数后不会存活
您正在动态分配的是一个结构队列类型的对象。分配对象的地址分配给本地指针。
你还需要 return 函数的指针。
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
return q;
}
否则会内存泄漏
至于文件范围内的指针声明
struct queue *q;
然后初始化为空指针。所以在这个函数中使用空指针访问内存
void create_queue(struct queue *q)
{
q -> rear = NULL;
q -> front = NULL;
}
调用未定义的行为。
那就是你需要动态分配的是一个结构类型的对象。将在何处声明指向已分配对象的指针实际上并不重要。重要的是指针必须指向结构类型的有效对象。在这种情况下,使用指针,您可以更改指针指向的对象的数据成员。
我正在练习队列,当我尝试创建一个这样的队列时
struct queue
{
struct node *front;
struct node *rear;
};
struct queue *q;
以及创建队列的函数
void create_queue(struct queue *q)
{
q -> rear = NULL;
q -> front = NULL;
}
它在运行时失败了,但是当我在函数内部动态分配指向队列的指针时 有效。 像这样
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
}
此代码:
struct queue
{
struct node *front;
struct node *rear;
};
struct queue *q;
创建指向 struct queue
的 NULL
指针。它 不 分配此结构的实例(与动态分配内存的代码不同)。
所以当你在这个 NULL
指针上调用 create_queue()
时,你(自然地)得到 SIGSEGV
.
要静态分配 struct queue
的实例,请执行以下操作:
struct queue q;
然后你可以用create_queue(&q)
初始化它。
P.S。静态分配的 struct queue
已经被零初始化,因此在该实例上调用 create_queue()
实际上是空操作。
在这个函数中
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
}
您并没有像您所说的那样动态分配指针。指针q是函数的局部变量,退出函数后不会存活
您正在动态分配的是一个结构队列类型的对象。分配对象的地址分配给本地指针。
你还需要 return 函数的指针。
struct queue* queue_create(void)
{
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
q->rear=NULL;
q->front=NULL;
return q;
}
否则会内存泄漏
至于文件范围内的指针声明
struct queue *q;
然后初始化为空指针。所以在这个函数中使用空指针访问内存
void create_queue(struct queue *q)
{
q -> rear = NULL;
q -> front = NULL;
}
调用未定义的行为。
那就是你需要动态分配的是一个结构类型的对象。将在何处声明指向已分配对象的指针实际上并不重要。重要的是指针必须指向结构类型的有效对象。在这种情况下,使用指针,您可以更改指针指向的对象的数据成员。