#include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
struct queue
{
struct node *front;
struct node *rear;
};
struct queue *q;
void create_queue(struct queue *);
int main()
{
create_queue(q);
ptr = (struct node*)malloc(sizeof(struct node));
ptr->data = 42;
q->front = ptr; <-- here it fails with Sementaion fault
return 0;
}
void create_queue(struct queue *q)
{
q = (struct queue*)malloc(sizeof(struct queue));
q->rear = NULL;
q->front = NULL;
}
这在尝试将 ptr 分配给队列前端时失败,但是如果我在create_queue(q)
之前将行q = (struct queue*)malloc(sizeof(struct queue));
移动到 main 函数,一切正常。分段错误错误的原因取决于代码中的内存分配位置。
您需要将双指针struct queue **q
传递给create_queue()
void create_queue(struct queue **q)
{
*q = (struct queue*)malloc(sizeof(struct queue));
(*q)->rear = NULL;
(*q)->front = NULL;
}
这是因为您要更新指针本身q
,而不是它指向的内容。
以下函数不会更新全局变量 q。
void create_queue(struct queue *q)
{
q = (struct queue*)malloc(sizeof(struct queue));
q->rear = NULL;
q->front = NULL;
}
它实际上是在处理局部变量,该变量超出了随后的内存泄漏范围(并且全局变量仍然指向一些垃圾(。 您需要以这种方式定义函数:
void create_queue(struct queue **q)
{
*q = (struct queue*)malloc(sizeof(struct queue));
*q->rear = NULL;
*q->front = NULL;
}
并称它
create_queue(&q);
所以你应该将变量的地址而不是值传递给函数。