C++合并有序链表编译报错:&运算符需要左值如何解决
合并有序链表时的编译错误排查
问题复现
实现两个有序链表合并为单链表时,首先定义链表节点结构体:
struct ListNode { int val; ListNode* next; ListNode(): val(0), next(nullptr){} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode* next) : val(x), next(next) {} };
编写逻辑时编译器在以下代码段抛出错误,提示&运算符需要左值:
int temp; ListNoded* currR; currR->next = &ListNode(); // What am I missing?
错误原因
- 存在基础笔误:声明
currR指针时类型名拼写错误,多写了一个字符d,正确类型应为ListNode*,该笔误本身就会触发类型不匹配的编译错误。 - 核心语法错误:
ListNode()是临时生成的右值对象,生命周期仅在当前代码行执行期间有效,C++语法不允许直接对右值使用取地址符&。即便通过特殊语法绕开这个限制拿到临时对象地址,当前行执行完毕后临时对象会立刻被系统销毁,currR->next会成为指向无效内存的野指针,后续访问必然触发内存崩溃。
修复方法
链表节点需要存储在堆内存上保证生命周期可控,将出错行替换为new动态创建节点的写法即可:
// 无参构造创建节点 currR->next = new ListNode(); // 如果需要存入指定值,调用对应传参构造即可,例如存入temp变量值 currR->next = new ListNode(temp);
注意:通过
new申请的堆内存需要在链表使用结束后主动遍历释放,避免出现内存泄漏。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

