C语言实现队列数据结构时遇解引用指针错误求助
搞定你的队列代码编译错误!
嘿,我一眼就看到你代码里的几个问题,正是它们导致了编译器报的"dereferencing pointer to incomplete type"错误,给你一步步理清楚:
1. 结构体大小写拼写搞混了!
你定义结构体的时候用的是struct Queue_node(注意是小写的n),但结构体内部的next指针却写成了struct Queue_Node* next;(大写的N)——C语言可是大小写敏感的,编译器根本认不出struct Queue_Node这个类型,自然不让你解引用指针啦。
另外你的typedef写法也不对,正确的姿势应该是给结构体起个别名,这样后面写代码更方便:
typedef struct Queue_node { int value; struct Queue_node* next; // 这里统一成小写n的结构体名 } QueueNode;
之后你就可以直接用QueueNode代替struct Queue_node,不用每次都写长长的结构体名。
2. malloc分配的内存大小错了!
你写的malloc(sizeof(struct Queue_node*))是在分配指针的大小(一般是4或8字节),但你需要的是整个队列节点结构体的大小啊!应该改成malloc(sizeof(struct Queue_node))(如果用了typedef就是malloc(sizeof(QueueNode)))。要是内存分配不够,后面访问temp->value或者temp->next会直接踩内存,搞不好程序就崩了。
3. 变量名可以更清晰点(可选优化)
你用R当队尾指针,建议改成rear,这样别人看代码或者你自己回头维护的时候,一眼就知道这是啥,不用猜半天。
修复好的完整代码
#include <stdio.h> #include <stdlib.h> // 修正后的结构体定义 typedef struct Queue_node { int value; struct Queue_node* next; } QueueNode; QueueNode* front = NULL; QueueNode* rear = NULL; // 把R改成rear,可读性拉满 void Enqueue(int x) { // 分配正确大小的内存,并且检查malloc是否成功 QueueNode* temp = (QueueNode*)malloc(sizeof(QueueNode)); if (temp == NULL) { printf("内存分配失败,入队失败!\n"); return; } temp->value = x; temp->next = NULL; if (front == NULL && rear == NULL) { front = temp; rear = temp; return; } rear->next = temp; rear = temp; }
额外提醒
- 永远要检查
malloc的返回值!要是内存不够,malloc会返回NULL,直接用这个空指针的话程序肯定崩。 - 后面写
Dequeue函数的时候,记得把出队的节点内存释放掉,不然会造成内存泄漏哦。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

