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

标签 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++) {
    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;
}

这一部分创建了我试图复制的数组的副本,但有一点不同。它不会将元素存储在所需的位置,但它并没有这样做,而是似乎进入了无限循环,或者实际上不是无限循环,而是非常非常大。太大以至于导致程序崩溃。

任何形式的帮助将不胜感激。

编辑:也许我应该从一开始就包含动态数组的定义。哦,好吧。

VectorDinamic * creazaVectorDinamic() {
VectorDinamic *v = malloc(sizeof(VectorDinamic));
v->elems = malloc(INIT_CAPACITY * sizeof(Element));
v->capacitate = INIT_CAPACITY;
v->lg = 0;
return v;

最佳答案

您有几个问题。首先:

  1. 您不需要 malloc() 一个全新的数组,然后将内容复制进去。只需使用 memmove 将要删除的元素上方的数组向下移动即可,然后 realloc 来缩小分配的内存。

  2. 循环将 i 递增两次,一次在 for 循环中,一次在 else 子句中。

  3. v->capacityv->lg 之间似乎存在一些混淆。这两者有什么区别?

一般来说,告诉我们在哪里以及如何崩溃会很有用,就像VectorDinamic的定义一样(注意动态 是这样拼写的)。尝试使用gdb或类似的。

关于c - 从C中的动态数组中的特定位置删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22942640/

相关文章:

这段代码可以包含缓冲区溢出吗?

c - CUDA 中的强制对齐?

c - 错误: expected statement before ‘)’ token in C macro

c++ - 在类中使用全局变量作为数组大小

delphi - 如何获取动态整数数组的最小值和最大值?

c - 我需要在嵌入式系统中以十六进制形式打印可变数量的字符以进行调试

C getchar() 奇怪的行为

c - 如何在C中正确实现动态数组

c - 如何在运行时将任何类型存储在 void* 中?

c - 使用动态数组按字母顺序对单词进行排序