gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:07 24 4
gpt4 key购买 nike

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

最佳答案

正如 Johnny Mopp 指出的那样的 comment上面,段错误是在这里造成的:

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

新定义的队列指针“queue”没有被设置为指向任何特定的东西。因此,它很可能指向一些实际上并不存在的奇怪内存位置。

代码被视为指向合法位置,尝试将“queue->size”归零。当处理器计算“奇怪的内存位置”+“struct queue”中 size 元素的偏移量时,它最终得到一个未在进程内存映射中列出的地址。这会导致不可恢复的错误,称为段错误。


修复:

改变:

Queue* newQueue(){
Queue* queue;

收件人:

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

关于当我尝试入队时出现 C 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com