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 queueNULL 指针。它 分配此结构的实例(与动态分配内存的代码不同)。

所以当你在这个 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;
}

调用未定义的行为。

那就是你需要动态分配的是一个结构类型的对象。将在何处声明指向已分配对象的指针实际上并不重要。重要的是指针必须指向结构类型的有效对象。在这种情况下,使用指针,您可以更改指针指向的对象的数据成员。