У меня трудное время, обертывающее мою голову вокруг C. Я пытаюсь реализовать связанный с FIFO список, где у меня есть ссылка на хвост списка для легкого доступа при добавлении элементов. Захват пустого списка отлично работает, когда голова и тыл будут тем же узлом. Однако, когда я вхожу в очередь во второй раз, задняя часть - это правильно новый узел, но голова также обновляется, что должно оставаться неизменным. Любые мысли о том, что я могу делать неправильно? Я заранее извиняюсь за однострочное условие, если его трудно прочитать.Неполадка добавления к задней части очереди FIFO в C со ссылкой на последний элемент
typedef struct node {
PCB *pcb;
struct node *next;
}Node;
typedef struct queue {
Node *head, *rear;
int size;
}Queue;
Queue * enqueue (Queue *queue, PCB *pcb) {
// Ready a new node to add to list:
Node node = {pcb, NULL};
// Node becomes head in empty list, otherwise appended to rear.
queue->size == 0 ? (queue->head = queue->rear = &node) : (queue->rear = &node);
// Keep track of list size
queue->size++;
return queue;
}
ОБНОВЛЕНО:
Queue * enqueue (Queue *queue, PCB *pcb) {
// Ready a new node to add to list:
Node *node = malloc(sizeof(Node));
node->pcb = pcb;
node->next = NULL;
// Node becomes head in empty list, otherwise appended to rear.
queue->size == 0 ? (queue->head = queue->rear = node) : (queue->rear->next = node);
// New node always becomes the new rear node
queue->rear = node;
// Keep track of list size
queue->size++;
return queue;
}
Сохраняется адрес локальной переменной в вашей очереди. 'node' выйдет за пределы области после возврата из' enqueue' и оставит указатели на очередь, указывающие на недопустимую память. –
Пожалуйста, покажите [MCVE] (http://stackoverflow.com/help/mcve). –
Дополнение к комментарию M Oehm: если вы объявляете 'static Node node = {pcb, NULL}; ваш код может работать, потому что тогда' node' будет существовать во время всего выполнения вашей программы, а не только внутри 'enqueue' function' –