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

如何实现C语言删除动态数组指定元素并返回新数组的函数?

实现思路
  • 第一步:遍历原数组,统计所有不需要删除的元素总个数,记为new_dim
  • 第二步:如果new_dim和原数组长度dim一致,说明没有匹配的待删除元素,直接返回原数组即可
  • 第三步:如果new_dim为0,说明所有元素都要被删除,释放原数组后返回NULL即可
  • 第四步:原地移动保留元素到数组前部,再用realloc缩容数组,或者申请新内存复制保留元素后释放原数组
  • 第五步:返回处理后的数组指针
完整代码实现(删除所有值等于el的元素)
#include <stdlib.h>

int* del_element(int* vector, int dim, int el)
{
    // 统计保留元素的数量
    int new_dim = 0;
    for (int i = 0; i < dim; i++) {
        if (vector[i] != el) {
            new_dim++;
        }
    }

    // 无元素需要删除
    if (new_dim == dim) {
        return vector;
    }

    // 所有元素都要删除
    if (new_dim == 0) {
        free(vector);
        return NULL;
    }

    // 原地移动保留元素到数组头部
    int pos = 0;
    for (int i = 0; i < dim; i++) {
        if (vector[i] != el) {
            vector[pos++] = vector[i];
        }
    }

    // 缩容数组到新长度
    int* new_vec = realloc(vector, new_dim * sizeof(int));
    // 若realloc失败返回原数组,也可根据需求改成free后返回NULL
    return new_vec ? new_vec : vector;
}
扩展实现(删除下标为el的元素)

如果你的需求是删除指定下标而非匹配值的元素,可参考以下代码:

#include <stdlib.h>

int* del_element(int* vector, int dim, int el)
{
    // 校验下标合法性
    if (el < 0 || el >= dim || vector == NULL) {
        return vector;
    }

    // 移动元素覆盖待删除位置
    for (int i = el; i < dim - 1; i++) {
        vector[i] = vector[i + 1];
    }

    // 缩容数组
    int* new_vec = realloc(vector, (dim - 1) * sizeof(int));
    return new_vec ? new_vec : vector;
}
注意事项
  • 原数组必须是malloc/calloc/realloc动态分配的,否则函数内的free和realloc会触发未定义行为
  • 函数返回的数组依然是动态分配的,使用完后需要调用者主动free,避免内存泄漏
  • 如果realloc调用失败,会返回未缩容的原数组,其中前N个元素是处理后的有效内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:36:09