C尝试排队时出现分段错误

C尝试排队时出现分段错误,c,data-structures,segmentation-fault,queue,producer-consumer,C,Data Structures,Segmentation Fault,Queue,Producer Consumer,我正在制作一个生产者/消费者模型,其中生产者需要将int值排队,消费者将其排出来。每当我尝试将int排入队列时,就会出现分段错误 以下是相关的队列代码: #include <stdio.h> #include <stdlib.h> typedef struct Node { int item; struct Node* next; } Node; typedef struct Queue { Node* head; Node* tail

我正在制作一个生产者/消费者模型,其中生产者需要将
int
值排队,消费者将其排出来。每当我尝试将
int
排入队列时,就会出现分段错误

以下是相关的队列代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int item;
    struct Node* next;
} Node;

typedef struct Queue {
    Node* head;
    Node* tail;

    void (*enqueue) (struct Queue* queue, int value);
    int (*dequeue) (struct Queue* queue);
    int (*queueEmpty) (struct Queue* queue);
    int size;
} Queue;

void enqueue (Queue* queue, int item){
    Node* n = (Node*) malloc (sizeof(Node));
    n->item = item;
    n->next = NULL;

    if (queue->head == NULL) { // no head
        queue->head = n;
    } else{
        queue->tail->next = n;
    }
    queue->tail = n;
    queue->size++;
}

Queue* newQueue(){
    Queue* queue;
    queue->size = 0;
    queue->head = NULL;
    queue->tail = NULL;
    queue->enqueue = &enqueue;
    queue->dequeue = &dequeue;
    queue->queueEmpty = &queueEmpty;
    return queue;
}
main
中初始化:

queue = newQueue();
生产商代码:

void* producer(void* arg) {

    int x;

    for (x = 0; x <= n; x++){
        pthread_mutex_lock(&lock);
        while(queueSize(queue) == maxsize){
            pthread_cond_wait(&lock, &empty)
        }
        enqueue(queue, x);
        pthread_mutex_unlock(&lock);
    }
      return(NULL);
}
void*生产者(void*arg){
int x;
对于(x=0;x,如上所述,分段错误的原因如下:

Queue* newQueue(){
    Queue* queue;
    queue->size = 0;   /**** Seg-fault ****/
新定义的队列指针“Queue”未设置为指向任何特定的对象。因此,它可能指向某个实际不存在的奇怪内存位置

将其视为指向合法位置,代码尝试将“队列->大小”归零。当处理器计算“奇异内存位置”+“结构队列中大小元素的偏移量”
”,它以进程内存映射中未列出的地址结束。这会导致称为分段错误的不可恢复错误


修正:

更改:

Queue* newQueue(){
    Queue* queue;
致:


您没有为队列分配任何内存。
Queue*Queue;
应该是
Queue*Queue=malloc(sizeof(Queue))
另外,在排队中,虽然你检查队列是否有头,但你不检查队列是否有尾。排队代码似乎用于空队列,但没有初始化尾,因此当你使用queue->tail->next时,queue->tail为NULL。@Misha他只在
head
为非NULL时才这样做。你第一次排队时,它同时设置
,这样应该是安全的(除非
出列
导致此条件改变).@Barmar看起来你是对的。不管怎样,你的评论发现了这个漏洞。我认为Johnny Mopp的评论发现了这个漏洞。我同意你的回答确定了问题,提供了一个体面的解决方案,并提到了必要的错误检查。我只是不确定当Johnny Mop在一个小时后指出问题时,你是否应该得到表扬r在您创建此答案之前。如果是我,我可能会创建一个社区Wiki答案并链接到发现问题的注释-但我接受对我的约束与对您的约束略有不同。@JonathanLeffler,明白。我对StackOverflow有些陌生;到目前为止,我还没有研究过“C”社区维基回答“事情的一面。我会努力弄清楚。同时,我编辑了我的回答,以感谢约翰尼·莫普的深刻评论。谢谢你的指导。
Queue* newQueue(){
    Queue* queue;
Queue* newQueue(){
Queue* queue = malloc(sizeof(*queue));
   /* Check here if malloc() was successful */