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

C语言错误修复:struct rest成员赋值需可修改左值问题

错误原因及修复方案

错误根源

报错的行r_list[index - 1].food = NULL;是因为food是结构体中的固定大小字符数组,数组名属于不可修改的左值(常量指针),不能直接赋值为NULL——这就是编译器提示“expression must be a modifiable lvalue”的核心原因。

另外你当前的代码只是清空元素值,并没有真正从动态数组中删除该元素。如果你的目标是移除这个元素(让后续元素填补空缺,减少数组有效元素数量),需要按以下步骤修改:

修复后的代码示例

#include <string.h>
#include <stdlib.h>

#define TSIZE 50

struct rest {
    char food[TSIZE]; // 菜品名称
    char kind;        // 菜品类型
    int price;        // 价格
};

void delete_an_item(struct rest *r_list, size_t *ptr_r_items){
    int index = input_int(); // 获取用户输入的索引(假设从1开始计数)
    size_t actual_idx = index - 1;

    // 校验输入的索引是否合法
    if (index < 1 || actual_idx >= *ptr_r_items) {
        // 索引无效,直接返回或提示错误
        return;
    }

    // 1. 如果只是清空该元素的内容(不是真正删除),替换错误的赋值方式
    memset(r_list[actual_idx].food, 0, TSIZE); // 清空字符串数组
    r_list[actual_idx].kind = '\0';
    r_list[actual_idx].price = 0;

    // 2. 如果要真正从动态数组中移除该元素(后续元素前移)
    // 从要删除的位置开始,将后面的元素依次往前挪一位
    for (size_t i = actual_idx; i < *ptr_r_items - 1; i++) {
        r_list[i] = r_list[i + 1];
    }

    // 减少有效元素数量
    (*ptr_r_items)--;

    // 可选:重新分配内存缩小数组(避免内存浪费)
    struct rest *temp = realloc(r_list, *ptr_r_items * sizeof(struct rest));
    if (temp != NULL) {
        r_list = temp;
    }
    // 注意:如果需要让调用者拿到新的数组指针,需要修改函数参数为**r_list
}

关键说明

  • 清空字符数组:用memset把数组内容置0,或者用strcpy(r_list[actual_idx].food, "")赋值空字符串,不能直接给数组名赋值NULL。
  • 真正删除元素:通过循环将目标位置后的元素向前覆盖,然后减少有效元素计数。如果需要优化内存,可以用realloc缩小数组,但要注意realloc可能失败,需要判断返回值。
  • 索引校验:原代码的条件index == 1限制只能删除第一个元素,建议去掉这个限制,让函数能处理任意合法索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:42