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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:33:25