结构体实现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
相关产品推荐
相关产品推荐

