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

LeetCode中两种ListNode指针初始化方式的差异咨询

两种指针初始化方式的差异与错误原因分析

第一种写法(触发错误)

ListNode *node1,*node2;
ListNode *p1=node1,*p2=node2;

这里ListNode *node1,*node2;是声明了两个未初始化的指针变量。局部指针变量默认是垃圾值(或被编译器初始化为nullptr),本质是无效的——要么指向不存在的内存,要么指向不属于当前程序的内存。后续把p1、p2直接赋值为这些无效指针,此时p1属于野指针/空指针。

当执行p1=p1->next=head;时,需要先访问p1->next,但p1本身是无效指针,自然触发member access within null pointer错误——你试图通过一个空/无效指针访问它的成员,这属于非法内存操作。

第二种写法(无错误)

ListNode node1,node2;
ListNode *p1=&node1,*p2=&node2;

这里ListNode node1,node2;是直接创建了两个实际存在的ListNode对象,它们被分配在栈内存中,是合法的实体(即使对象的next成员未初始化,对象本身的内存是属于当前程序的)。后续p1=&node1让指针p1指向这个真实存在的对象地址,此时p1是有效指针。

这时访问p1->next是合法的:你只是访问一个真实对象的成员,哪怕next的值是随机的,也不会触发空指针错误(后续逻辑可根据需求给next赋值正确内容)。

核心差异总结

  • 第一种写法:只声明指针,未让指针指向任何有效对象,指针本身是无效的;
  • 第二种写法:先创建实体对象,再让指针指向该对象的合法地址,指针是有效的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:18:14