C语言如何声明并访问指向嵌套结构体成员的指针?队列实现场景问题
问题根因
你代码的核心问题出在CreateQueue函数的返回逻辑:
函数内定义的Queue q是栈上的临时局部变量,你给q.size赋值的是当前临时变量内部q.items.size的内存地址。当函数执行结束返回q时,C语言会做值拷贝,把临时q的所有成员复制给main函数里的q对象,但size指针只会复制地址值,不会自动更新为新的main函数里q.items.size的地址,导致size指针指向已经被销毁的栈内存,访问该指针属于未定义行为,自然会得到错误的结果。
最优解决方案(推荐)
直接删掉Queue结构体里冗余的int *size成员即可,不需要单独维护size指针,直接访问内部LinkedList的size成员就可以:
- 修改Queue结构体定义,删除
int *size行:
typedef struct queue { LinkedList items; int (*enqueue) (struct queue*, int); int (*dequeue) (struct queue*); int (*peek) (struct queue*, int); void (*display) (struct queue*); } Queue;
- 修改
CreateQueue函数,删除给size赋值的代码:
Queue CreateQueue() { Queue q; q.items = createLinkedList(); q.enqueue = &enqueue; q.dequeue = &dequeue; q.peek = &peek; q.display = &display; return q; }
- 修改
display函数,直接取items的size值:
void display(Queue* self) { printf("%d items in queue.\n", self->items.size); self->items.display_list(&(self->items)); }
修改完后运行即可得到预期输出:
3 items in queue. [3, 7, 4] Dequeued: 3 2 items in queue. [7, 4] 3 items in queue. [7, 4, 14]
其他注意事项
- C语言标准中main函数的返回值应为
int而非void,建议修改为int main()并在末尾加return 0; - 你当前的链表删除逻辑中,当删除最后一个节点后没有把
head和tail都置为NULL,后续操作可能会触发野指针问题,建议补充对应的边界处理逻辑 - 所有
malloc申请的内存记得在使用完后free,避免内存泄漏
内容的提问来源于stack exchange,提问作者Extr3mis
相关产品推荐
相关产品推荐

