我在理解 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;
最佳答案
您有几个问题。首先:
您不需要
malloc()
一个全新的数组,然后将内容复制进去。只需使用memmove
将要删除的元素上方的数组向下移动即可,然后realloc
来缩小分配的内存。循环将
i
递增两次,一次在for
循环中,一次在else
子句中。v->capacity
和v->lg
之间似乎存在一些混淆。这两者有什么区别?
一般来说,告诉我们在哪里以及如何崩溃会很有用,就像VectorDinamic
的定义一样(注意动态 是这样拼写的)。尝试使用gdb
或类似的。
关于c - 从C中的动态数组中的特定位置删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22942640/