C语言如何删除动态分配的struct结构体数组中的指定元素
C语言动态结构体数组删除指定元素实现方案
实现逻辑
- 先校验是否已创建用户列表,避免空指针访问
- 读取待删除的用户名,遍历结构体数组匹配目标用户,记录对应的下标
- 匹配成功后,将待删除下标之后的所有元素依次向前移动一位,覆盖待删除的元素
- 将数组长度
n减1,调用realloc收缩动态内存空间 - 兼容未匹配到用户、内存分配失败的异常场景
case 3 完整实现代码
case 3: // 校验列表是否已初始化 if (n == 0 || clt == NULL) { printf("请先执行选项1创建用户列表\n"); break; } int del_index = -1; d = 0; printf("输入要删除的用户名:"); scanf("%s", name); // 查找待删除的用户下标 for (int i = 0; i < n; i++) { // 此处原代码不需要&操作符,name本身是字符数组首地址 if (strcmp(clt[i].name, name) == 0) { del_index = i; d = 1; break; // 仅删除第一个匹配的用户,若需删除所有同名用户可移除该行 } } if (d == 0) { printf("待删除用户不存在\n"); break; } // 移动元素覆盖待删除位置 for (int i = del_index; i < n - 1; i++) { // C语言支持结构体直接赋值拷贝,无需逐个拷贝成员 clt[i] = clt[i + 1]; } // 收缩动态内存 n--; struct clients *temp = realloc(clt, n * sizeof(struct clients)); // n为0时realloc返回NULL属于正常情况,等价于free if (temp != NULL || n == 0) { clt = temp; printf("用户删除成功,当前剩余用户数:%d\n", n); } else { printf("内存收缩失败,用户数据未丢失\n"); // 内存分配失败时恢复数组长度 n++; } break;
原有代码优化建议
- 原case2逻辑中每次查询后没有重置计数变量
d,会导致第二次查询时计数错误,建议进入case2时先执行d=0 - 程序退出前需要释放动态申请的内存,在case4分支中添加
free(clt);即可避免内存泄漏 - 结构体数组成员访问建议使用
clt[i].name的写法,比(clt+i)->name可读性更高
内容的提问来源于stack exchange,提问作者Victor Guidi
相关产品推荐
相关产品推荐

