基于数组实现的C队列存储LTE-M失败消息异常问题排查
问题分析与修复方案
核心问题定位
你的队列实现存在两个致命错误,导致队首元素显示异常:
1. 内存分配尺寸错误
在enqueue函数中,你使用sizeof(element)计算字符串长度,但element是char*类型,sizeof(element)返回的是指针本身的大小(32位系统为4字节,64位为8字节),而非字符串的实际长度。这会导致内存分配不足,strcpy写入时发生缓冲区溢出,破坏数据。
2. 队列索引逻辑错误
当前enqueue先递增tail再存储元素,导致第一个元素被存在索引1的位置,但head初始值为0,front()返回的是未初始化的values[0],自然得到垃圾数据。
完整修复代码
修复后的queue_array.c
#include "queue_array.h" #include <string.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> void init_queue(queue *q, int max_size) { q->size = max_size; q->values = malloc(sizeof(char*) * q->size); q->num_entries = 0; q->head = 0; q->tail = 0; } bool queue_empty(queue*q) { return(q->num_entries == 0); } bool queue_full(queue*q) { return(q->num_entries == q->size); } void queue_destroy(queue*q) { if (q->values == NULL) return; // 先释放所有存储的字符串 for (int i = 0; i < q->num_entries; i++) { int idx = (q->head + i) % q->size; free(q->values[idx]); } free(q->values); q->values = NULL; q->head = q->tail = q->num_entries = q->size = 0; } int dequeue(queue *q) { if(queue_empty(q)) { return QUEUE_EMPTY; } // 释放被移除元素的内存 free(q->values[q->head]); q->head = (q->head + 1) % q->size; q->num_entries--; return 1; } char* front(queue *q) { if(queue_empty(q)) { return NULL; } return q->values[q->head]; } int count_queue(queue *q) { return q->num_entries; } bool enqueue(queue *q , char *element) { if(queue_full(q)) { return false; } // 根据字符串实际长度分配内存(+1用于存储终止符) q->values[q->tail] = malloc(strlen(element) + 1); if (q->values[q->tail] == NULL) { // 内存分配失败 return false; } strcpy(q->values[q->tail], element); q->tail = (q->tail + 1) % q->size; q->num_entries++; return true; }
修复后的测试代码
char *temp; queue msg_queue; // 确保队列变量已声明 init_queue(&msg_queue, 5); enqueue(&msg_queue,"FIRSTFAILEDTEXTMESSAGE"); enqueue(&msg_queue,"SECONDFAILEDTEXTMESSAGE"); temp = front(&msg_queue); // 此时temp指向完整的"FIRSTFAILEDTEXTMESSAGE" printf("%s\n", temp); // 使用完毕后销毁队列避免内存泄漏 queue_destroy(&msg_queue);
额外优化说明
- 内存泄漏修复:新增了
dequeue时释放元素内存、queue_destroy时遍历释放所有元素的逻辑,避免内存泄漏。 - 空队列判断:
front()函数改为判断队列是否为空,而非队列尺寸是否为0,逻辑更严谨。 - 内存分配检查:新增
malloc失败的判断,增强代码健壮性。
内容的提问来源于stack exchange,提问作者Paelli
相关产品推荐
相关产品推荐

