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

C语言链表节点数组成员交换报E0137可修改左值错误如何解决

错误原因排查
  • C语言中数组名是不可修改的左值,你代码里的lname、marks都是数组成员,直接用=给数组名赋值属于非法操作,这是触发E0137报错的直接原因。数组名本质是数组首元素的地址常量,不能作为赋值运算符的左值使用。
  • 你定义的struct st* temp是未初始化的野指针,没有申请对应的内存空间就直接访问temp->lname、temp->marks属于非法内存访问,就算解决了数组赋值的问题,运行时也会触发段错误。
解决方法

方案1:直接交换整个结构体(推荐,写法最简单)

C语言支持同类型结构体直接整体赋值,不需要单独拷贝每个成员,修改后的代码如下:

void swap(struct st* a, struct st* b)
{
    // 直接用结构体变量存临时值,不需要指针
    struct st temp = *a;
    *a = *b;
    *b = temp;
}

该方案会自动拷贝所有成员,包括数组、数值类型成员,不需要手动处理每个字段。

方案2:手动拷贝数组成员(确需单独处理字段时使用)

如果业务要求必须单独操作每个成员,字符串数组用strcpy拷贝,普通数组用memcpy拷贝即可,修改示例:

#include <string.h> // 需引入头文件才能调用strcpy、memcpy

void swap(struct st* a, struct st* b)
{
    // 示例数组长度请替换为你实际定义的数组长度,此处假设lname长度为20,marks长度为5
    char temp_lname[20];
    double temp_marks[5];

    // 拷贝字符串类型数组
    strcpy(temp_lname, a->lname);
    strcpy(a->lname, b->lname);
    strcpy(b->lname, temp_lname);

    // 拷贝double类型数组,参数依次为:目标地址、源地址、拷贝的字节数
    memcpy(temp_marks, a->marks, sizeof(temp_marks));
    memcpy(a->marks, b->marks, sizeof(a->marks));
    memcpy(b->marks, temp_marks, sizeof(temp_marks));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:36:03