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明确指向了链表的第一个节点,后续遍历自然能找到数据。
第二段代码失效的关键问题
- 未初始化的野指针:
你声明list_t * planetList;后,没有给它赋值,这时候它是一个野指针——指向内存中某个随机的、无效的地址。 - 指针赋值的逻辑错误:
你把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
相关产品推荐
相关产品推荐

