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

