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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:06:03