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

