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

C语言链表中结构体代码异常:两段代码为何一正常一失效?

为什么第二段链表初始化代码无法工作?

你遇到的问题核心是野指针和指针赋值的逻辑错误,咱们一步步拆解来看:

首先把你的代码整理出来方便分析:

typedef struct { float gravity; float difficulty; }planet_t; 
typedef struct list { struct list * next; planet_t planet; }list_t; 

int main() { 
    // this piece works
    list_t * planetList; 
    planetList = malloc(sizeof(list_t)); 
    planetList->planet.gravity=9.8; 
    planetList->planet.difficulty = 2; 
    planetList->next = NULL; 

    // this does not work
    list_t * planetList; 
    list_t * temp = planetList; 
    temp=malloc(sizeof(list_t)); 
    temp->planet.gravity=9.8; 
    temp->planet.difficulty = 2; 
    temp->next = NULL; 

    /* let's assume here is the working code which prints all the elements in Linked List */ 
}

第一段代码能正常运行的原因

第一段里,你先声明了planetList指针,紧接着就用malloc给它分配了有效的内存空间,让它指向一个合法的list_t节点。之后所有对planetList的操作都是在这块有效内存上进行的,头指针planetList明确指向了链表的第一个节点,后续遍历自然能找到数据。

第二段代码失效的关键问题

  1. 未初始化的野指针:
    你声明list_t * planetList;后,没有给它赋值,这时候它是一个野指针——指向内存中某个随机的、无效的地址。
  2. 指针赋值的逻辑错误:
    你把temp初始化为planetList(也就是野指针),然后给temp分配了新内存。但这里要注意:temp是一个独立的指针变量,给它重新赋值并不会改变planetList的指向!
    结果就是:temp指向了新分配的有效节点,但planetList仍然是原来的野指针,后续遍历链表时,头指针planetList根本没有关联到你创建的节点,自然找不到任何数据。

修正第二段代码的方法

要让第二段代码正常工作,你需要把新分配的节点地址赋值给planetList,比如:

list_t * planetList = NULL; // 先初始化为NULL,避免野指针
list_t * temp = malloc(sizeof(list_t)); 
temp->planet.gravity=9.8; 
temp->planet.difficulty = 2; 
temp->next = NULL; 
planetList = temp; // 让头指针指向新创建的节点

这样planetList就正确指向了链表的第一个节点,后续遍历就能正常访问数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:02:48