C语言队列链表程序仅显示整型变量 char数组存储字符串不显示问题
问题原因
核心原因有两点:
- 分支判断缺少花括号,空队列时非法访问内存
你代码中case3分支的if (val != -1)没有用花括号包裹后续的打印语句,只有第一行提示语属于if的执行范围。当队列为空时,peek返回-1,程序依然会执行q->front->id这类空指针访问操作,读取的内存内容是无效的,自然无法输出正常字符串。而整型变量val已经提前返回了-1,所以看起来表现正常。 - 节点插入时仅复制了字符串指针,没有拷贝实际内容
如果你的结构体中存储字符串的字段是char*类型,插入节点时如果直接把接收用户输入的临时局部数组的地址赋值给这些指针,当插入函数执行完毕后,临时数组会被系统回收,指针指向的内存内容会被后续操作覆盖,因此读取时无法得到原有字符串。而整型数据是值拷贝,不受内存回收的影响,所以能正常显示。
修复方案
- 补全分支判断的花括号,确保只有队列非空时才访问节点内容:
case 3: val = peek(q); if (val != -1) { printf("\nAs informações do Aviao no inicio da fila são:\n"); printf("ID: %s\t", q->front->id); printf("Numero De Passageiros: %d\t", val); printf("Destino: %s\t", q->front->des); printf("Empressa: %s\t", q->front->comp); printf("Modelo: %s\t", q->front->mod); } break;
- 修改节点插入逻辑,完成字符串深拷贝:
如果结构体字段是char*类型,需要先申请对应长度的内存再拷贝内容,示例如下(根据你实际的变量名调整即可):
// 每个字符串字段都需要单独申请内存并拷贝 new_node->id = malloc(strlen(用户输入的ID字符串) + 1); strcpy(new_node->id, 用户输入的ID字符串);
如果可以修改结构体定义,建议直接把字符串字段设置为固定长度的字符数组,比如char id[32]; char des[64];,插入时直接调用strcpy拷贝即可,不需要单独申请内存,降低出错概率。
3. 检查并补全display函数的花括号,你贴出的代码中display函数末尾缺少一个闭合花括号,也可能导致执行逻辑异常。
如果完成上述修改后仍有问题,检查输入逻辑,确保读取字符串前清空了输入缓冲区,避免换行符被当做有效内容读到字符串中,导致字符串为空。
内容的提问来源于stack exchange,提问作者LEO101
相关产品推荐
相关产品推荐

