我尝试入队时出现C分段错误

时间:2014-05-01 02:39:29

标签: 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;

    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;
}

然后我将此作为prodcons.c文件中的共享资源:

Queue* 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);
}

1 个答案:

答案 0 :(得分:1)

正如上面的Johnny Mopp&#39; comment所指出的,分段错误是由此引起的:

Queue* newQueue(){
    Queue* queue;
    queue->size = 0;   /**** Seg-fault ****/

新定义的队列指针&#39;队列&#39;并没有特别指出任何事情。因此,它可能指向一些实际上并不存在的奇怪记忆位置。

当它指向合法位置时,代码会尝试归零&#39; queue-&gt; size&#39;。当处理器计算出奇怪的存储位置&#34; +&#34; struct queue&#34;中大小元素的偏移量,最终会得到一个未在流程中列出的地址&#39;记忆图。这会导致一个不可恢复的错误,称为分段错误。


FIX:

变化:

Queue* newQueue(){
    Queue* queue;

要:

Queue* newQueue(){
Queue* queue = malloc(sizeof(*queue));
   /* Check here if malloc() was successful */