You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于数组实现的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);

额外优化说明

  1. 内存泄漏修复:新增了dequeue时释放元素内存、queue_destroy时遍历释放所有元素的逻辑,避免内存泄漏。
  2. 空队列判断:front()函数改为判断队列是否为空,而非队列尺寸是否为0,逻辑更严谨。
  3. 内存分配检查:新增malloc失败的判断,增强代码健壮性。

内容的提问来源于stack exchange,提问作者Paelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:01:17