我制作了一个生产者/消费者模型,其中生产者需要将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);
}
答案 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 */