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

C语言:指针与多结构体问题——链表集合无法访问首节点

问题原因与修复方案

你的代码问题出在未给链表集合中的指针成员分配内存:

  • 单独的list指针通过malloc分配了struct linked_list_的内存空间,所以list->first_node是对一块有效内存的访问,自然能正常工作。
  • 而set_of_lists只是分配了struct set_of_linked_lists_结构体本身的内存,这个结构体里的list_1、list_2、list_3都是指针类型,malloc不会自动初始化这些指针,它们的值是随机的野指针。直接通过set_of_lists->list_1->first_node访问,本质是对野指针解引用,会触发未定义行为(程序崩溃或异常)。

修复方法

有两种常见的修复思路:

思路1:给集合中的每个链表指针分配内存

在使用list_1之前,先为它分配struct linked_list_的内存空间:

int main()
{
    struct set_of_linked_lists_ *set_of_lists = malloc(sizeof(struct set_of_linked_lists_));
    struct linked_list_ *list = malloc(sizeof(struct linked_list_));

    list->first_node = NULL;

    // 先给list_1分配内存
    set_of_lists->list_1 = malloc(sizeof(struct linked_list_));
    set_of_lists->list_1->first_node = NULL;  // 现在可以正常运行

    // 记得后续要释放所有分配的内存,避免内存泄漏
    free(list);
    free(set_of_lists->list_1);
    free(set_of_lists);

    return 0;
}

思路2:将集合中的成员改为结构体而非指针

如果不需要动态创建链表,可以把struct set_of_linked_lists_里的成员改成直接的结构体类型,这样分配集合内存时会自动包含链表的内存:

struct set_of_linked_lists_
{
    struct linked_list_ list_1;  // 改为结构体,而非指针
    struct linked_list_ list_2;
    struct linked_list_ list_3;
};

int main()
{
    struct set_of_linked_lists_ *set_of_lists = malloc(sizeof(struct set_of_linked_lists_));
    struct linked_list_ *list = malloc(sizeof(struct linked_list_));

    list->first_node = NULL;

    // 直接访问,无需额外分配内存
    set_of_lists->list_1.first_node = NULL;  // 注意这里用.而非->

    free(list);
    free(set_of_lists);

    return 0;
}

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:46:01