在 C 中为结构分配内存后出现分段错误


#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);

所以你应该将变量的地址而不是值传递给函数。

相关内容

  • 没有找到相关文章

最新更新