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
相关产品推荐
相关产品推荐

