为什么这个程序在这个队列程序中给出了段错误

时间:2017-03-23 19:30:14

标签: c pointers scope initialization function-call

这是队列的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 *);
struct queue *insert(struct queue *,int);

int main()
{

int val, option;
create_queue(q);

do
{

printf("\n *****MAIN MENU*****");       
printf("\n 1. INSERT");     
printf("\n Enter your option : ");
scanf("%d", &option);

switch(option)
        {
            case 1:             
                                printf("\n Enter the number to insert in the queue:");
                scanf("%d", &val);
                q = insert(q,val);
                break;

        }

}while(option != 5);

return 0;
}

void create_queue(struct queue *q)
{
    q = (struct queue *)malloc(sizeof(struct queue));
    q->rear = NULL;//how this happened without any error??
    q->front = NULL;
}

struct queue *insert(struct queue *q,int val)
{

struct node *ptr;

ptr = (struct node*)malloc(sizeof(struct node));
if(ptr == NULL)
{
    printf("error in allocating\n");
    return -1;
}
    ptr->data = val;
    if(q->front == NULL)
    {
        q->front = ptr;//here I get segmentation fault
        q->rear = ptr;
        q->front->next = q->rear->next = NULL;
    }
    else
    {
        q->rear->next = ptr;
        q->rear = ptr;
        q->rear->next = NULL;
    }

return q;
}

我的计划有什么问题? 为什么新节点的分配不起作用,当前的语法是什么?

1 个答案:

答案 0 :(得分:1)

这里的问题是,当您使用全局变量调用函数并接受函数参数时,函数参数将成为被调用函数的本地函数。

这样,局部变量会影响全局变量,并且由于C使用pass-by-value进行函数参数传递,因此对本地副本所做的任何更改都不会反映给调用者。

最后,全局指针p仍然未初始化。尝试取消引用会导致undefined behavior

你要么

  • 不需要将全局(s)作为参数传递
  • 传递指针的地址并在函数内部进行操作。

那就是please see this discussion on why not to cast the return value of malloc() and family in C.