在C中从动态数组中的特定位置删除元素
我在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++) {
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
”长)@mikev->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;