在C中从动态数组中的特定位置删除元素

在C中从动态数组中的特定位置删除元素,c,dynamic-arrays,C,Dynamic Arrays,我在C语言中的指针和内存管理方面遇到了一些麻烦 在这个特定的实例中,我试图从动态分配的数组中删除一个元素 考虑以下代码行: void deleteElemFromPosition(VectorDinamic *v, unsigned int poz){ int nCap = v->capacity; Element* nElems = malloc(nCap * sizeof(Element)); int i; for (i = 0; i < v->lg; i++) {

我在C语言中的指针和内存管理方面遇到了一些麻烦

在这个特定的实例中,我试图从动态分配的数组中删除一个元素

考虑以下代码行:

void deleteElemFromPosition(VectorDinamic *v, unsigned int poz){
int nCap = v->capacity;
Element* nElems = malloc(nCap * sizeof(Element));

int i;
for (i = 0; i < v->lg; i++) {
    if(i!=poz)nElems[i] = v->elems[i];
    else{
            nElems[i]=v->elems[i+1];
            ++i;

    }
}

free(v->elems);
v->elems = nElems;
v->capacity = nCap;
}

你有几个问题。首先:

  • 您不需要
    malloc()
    一个全新的数组,然后在其中复制内容。只需使用
    memmove
    向下移动要删除的元素上方的元素,然后使用
    realloc
    缩小分配的内存

  • 循环将
    i
    增加两次,一次在
    for
    循环中,一次在
    else
    子句中

  • v->capacity
    v->lg
    之间似乎存在一些混淆。这两者有什么区别


  • 一般来说,告诉我们它在何处以及如何崩溃将是有用的,正如
    矢量动力学的定义一样(注意动态是这样拼写的)。尝试使用
    gdb
    或类似工具。

    这样很难找到bug。可能有多个元素会导致程序崩溃,比如
    malloc(nCap*sizeof(Element))
    在出错时返回
    null
    ,或者
    free(v->elems)如果
    v->elems
    是静态分配的,或者如果
    null
    。我们不知道什么是
    v->lg
    。。。
    尝试使用
    gdb
    valgrind

    调试哪个部分有错误?您是否尝试注释掉部分代码,直到它不会崩溃?在这种情况下,
    v->lg
    v->capacity
    设置为什么?
    v->elems有多大?(我假设至少“
    lg
    ”长)@mike
    v->lg
    是数组的当前长度<代码>nCap
    我认为是多余的。这是另一段代码留下的。该部件用于扩展动态阵列的最大容量<代码>nCap
    是新的capacity@staticx如果我正确理解了你的问题,那么循环就被窃听了。程序实际上进入了循环,但没有退出并崩溃。@JohnB:我的意思是,如果你指向代码中的确切行并告诉我们,当你运行它时,这一行导致它崩溃,那么我们将更容易帮助你。对于您提供的内容,很难获得好的答案,因为我们必须逐步检查您的代码,您应该已经完成了。我不是想卑鄙或粗鲁,请不要那样认为。是的,我担心语言障碍可能会引起一些问题。谢谢你的
    memmove
    建议,我
    会试试,然后再报告。至于你的第二点,是的。我知道,
    I`会增加两次,因为当
    I
    达到
    poz
    的值时,我们不需要存储该值,我们跳过它。所以我就是这么做的:
    void deletelemfromposition(VectorDinamic*v,unsigned int poz){unsigned int I;for(I=poz;ilg;I++){memmove(v->elems[I],v->elems[I+1],sizeof(Element));}}
    但程序仍然崩溃。我怀疑问题在于
    for
    循环中的结束条件。编辑:是的,打印它(
    v->lg
    )会产生7083328。@JohnB:这是一个垃圾值,您正在读取不属于您的对象或从错误的位置读取的内存。需要更仔细地审视你的设计。
    VectorDinamic * creazaVectorDinamic() {
    VectorDinamic *v = malloc(sizeof(VectorDinamic));
    v->elems = malloc(INIT_CAPACITY * sizeof(Element));
    v->capacitate = INIT_CAPACITY;
    v->lg = 0;
    return v;