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

C语言结构体排序assignment to expression with array type错误修复

C语言排序结构体数组成员触发assignment to expression with array type报错修复

问题场景

实现链表存储的健身用户数据按activity字段排序时,编译阶段触发数组类型赋值错误,相关代码与错误定位如下:

原结构体定义

struct fitnessTracking {
    char activity[50], unit[50];
    int calories;
    float total, weight, height, bmi;
};
struct recordDate {
    int dd, mm, yyyy;
    int duration;
};
struct user {
    char username[50];
    struct fitnessTracking tracker;
    struct recordDate record;
};

struct Number {
    struct Number *ptrnext;
    struct user member;
};

struct Number *newptr, *currentptr;

原排序函数实现

void activitySort(struct Number *head){
    struct Number *temp = NULL; struct Number *ptr=NULL;
    currentptr = head;

    if(head == NULL)
        return;

    while(currentptr != NULL){ //while current pointer not null
        ptr = currentptr->ptrnext;
        while(ptr != NULL){
            if(currentptr->member.tracker.activity > ptr->member.tracker.activity){
                temp = currentptr->member.tracker.activity;
                currentptr->member.tracker.activity = ptr->member.tracker.activity;
                ptr->member.tracker.activity = temp;
            }ptr = ptr->ptrnext;
        }currentptr=currentptr->ptrnext;
    }
}

报错位置

错误触发在以下两行,编译提示error: assignment to expression with array type:

currentptr->member.tracker.activity = ptr->member.tracker.activity;
ptr->member.tracker.activity = temp;

错误原因

  • C语言中数组属于不可直接赋值的左值,无法通过=运算符直接完成数组内容的复制,直接对数组名赋值是语法错误
  • 直接用>比较两个char数组的逻辑不成立:数组名在表达式中会退化为首元素内存地址,直接比较的是两个数组的内存位置,不是字符串实际的字典序
  • 原代码定义的temp是struct Number*指针类型,和char[50]的activity字段类型不匹配,且仅尝试交换activity单个字段,排序后会出现运动类型和同记录下的卡路里、时长、用户信息等数据错位的逻辑问题

修复方法

  1. 引入<string.h>头文件,使用标准库函数处理字符串:
    • 用strcmp()函数比较两个字符串的字典序,函数返回值大于0时表示第一个字符串大于第二个
    • 用strcpy()函数完成字符串内容的复制,不要直接用=给字符数组赋值
  2. 排序交换时优先交换整条struct user记录,避免单字段交换导致的数据错位(C语言中同类型结构体支持直接赋值,无需逐字段复制)

修复后完整代码

#include <string.h>

void activitySort(struct Number *head){
    struct user temp_member; // 暂存整条用户记录的临时变量
    currentptr = head;

    if(head == NULL)
        return;

    while(currentptr != NULL){
        struct Number *ptr = currentptr->ptrnext;
        while(ptr != NULL){
            // 按activity字符串字典序比较
            if(strcmp(currentptr->member.tracker.activity, ptr->member.tracker.activity) > 0){
                // 直接交换整条记录,保证数据关联正确
                temp_member = currentptr->member;
                currentptr->member = ptr->member;
                ptr->member = temp_member;
            }
            ptr = ptr->ptrnext;
        }
        currentptr = currentptr->ptrnext;
    }
}

如果业务场景确实只需要交换activity字段,可将交换逻辑替换为以下字符串复制逻辑,注意临时数组长度要和activity定义的长度一致:

char temp_activity[50];
strcpy(temp_activity, currentptr->member.tracker.activity);
strcpy(currentptr->member.tracker.activity, ptr->member.tracker.activity);
strcpy(ptr->member.tracker.activity, temp_activity);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:27:20