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

结构体实现FIFO队列失败,数据存储功能异常排查求助

排查结构体实现FIFO队列的问题

看起来你卡在基于结构体的FIFO队列实现上了,从昨晚开始排查肯定挺头疼的~先看看你给出的代码片段,我梳理几个潜在问题,再给你一个能正常运行的原型示例。

现有代码的核心问题

你给出的代码只定义了队列结构体和一个函数声明,但缺少队列初始化、入队、出队的核心逻辑实现;而且结构体里的char *vetorFila[TAM]是指针数组,如果不处理内存分配,直接赋值字符串会导致野指针或者内存访问错误,这大概率是你存储功能失效的原因。

先拆解下你的结构体:

#define TAM 10
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>

typedef struct {
    int final;          // 队列尾指针
    int inicio;         // 队列头指针
    int tamanho;        // 队列总容量(其实可以直接用宏TAM代替)
    int contador;       // 当前元素数量
    char *vetorFila[TAM]; // 存储字符串的指针数组
} pretendentes;

这里的tamanho字段其实可以用TAM替代,没必要单独存储;另外vetorFila的每个元素都是char*,必须为每个要存储的字符串分配独立内存,否则会出现内存泄漏或非法内存访问的问题。

修复后的完整原型代码

我补全了初始化、入队、出队和打印队列的函数,实现基础的存储功能:

#define TAM 10
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>

typedef struct {
    int final;
    int inicio;
    int contador;
    char *vetorFila[TAM];
} pretendentes;

// 初始化队列,避免野指针和无效状态
void inicializarFila(pretendentes *fila) {
    fila->inicio = 0;
    fila->final = 0;
    fila->contador = 0;
    for (int i = 0; i < TAM; i++) {
        fila->vetorFila[i] = NULL;
    }
}

// 入队:存储字符串,处理内存分配和队列边界
int enfileirar(pretendentes *fila, const char *dado) {
    if (fila->contador == TAM) {
        printf("队列已满,无法添加新元素!\n");
        return 0;
    }
    // 为字符串分配内存并复制内容
    fila->vetorFila[fila->final] = malloc(strlen(dado) + 1);
    if (fila->vetorFila[fila->final] == NULL) {
        printf("内存分配失败!\n");
        return 0;
    }
    strcpy(fila->vetorFila[fila->final], dado);
    // 循环队列方式更新尾指针,避免空间浪费
    fila->final = (fila->final + 1) % TAM;
    fila->contador++;
    return 1;
}

// 出队:移除并返回队首元素,记得释放对应内存
char* desenfileirar(pretendentes *fila) {
    if (fila->contador == 0) {
        printf("队列为空,无法移除元素!\n");
        return NULL;
    }
    char *dado = fila->vetorFila[fila->inicio];
    fila->vetorFila[fila->inicio] = NULL;
    // 循环队列方式更新头指针
    fila->inicio = (fila->inicio + 1) % TAM;
    fila->contador--;
    return dado;
}

// 打印队列所有元素
void imprimirFila(pretendentes *fila) {
    if (fila->contador == 0) {
        printf("队列为空\n");
        return;
    }
    printf("队列元素:");
    int idx = fila->inicio;
    for (int i = 0; i < fila->contador; i++) {
        printf("%s ", fila->vetorFila[idx]);
        idx = (idx + 1) % TAM;
    }
    printf("\n");
}

// 释放队列所有内存,避免泄漏
void liberarFila(pretendentes *fila) {
    for (int i = 0; i < TAM; i++) {
        if (fila->vetorFila[i] != NULL) {
            free(fila->vetorFila[i]);
            fila->vetorFila[i] = NULL;
        }
    }
}

int main() {
    setlocale(LC_ALL, "");
    pretendentes fila;
    inicializarFila(&fila);

    // 测试入队
    enfileirar(&fila, "João");
    enfileirar(&fila, "Maria");
    enfileirar(&fila, "Carlos");
    imprimirFila(&fila);

    // 测试出队
    char *dado = desenfileirar(&fila);
    if (dado != NULL) {
        printf("出队元素:%s\n", dado);
        free(dado); // 出队后单独释放元素内存
    }
    imprimirFila(&fila);

    liberarFila(&fila);
    return 0;
}

关键注意事项

  • 内存管理:每个入队的字符串都要用malloc分配内存,出队后要释放对应内存,队列销毁时也要遍历释放所有未出队的元素,避免内存泄漏。
  • 循环队列处理:用(指针 + 1) % TAM的方式更新头尾指针,避免队列空间浪费。
  • 边界检查:入队前检查队列是否已满,出队前检查队列是否为空,防止数组越界。

你可以把这个原型跑起来测试,再根据自己的需求调整功能~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:33:25