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

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成员就可以:

  1. 修改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;
  1. 修改CreateQueue函数,删除给size赋值的代码:
Queue CreateQueue()
{
    Queue q;
    q.items = createLinkedList();
    q.enqueue = &enqueue;
    q.dequeue = &dequeue;
    q.peek = &peek;
    q.display = &display;
    return q;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:01