我有一个方法rtable_remove,类似于以下
int rtable_remove(RESIZABLE_TABLE * table, char * name) {
int i = 0;
int j = 0;
int position = 0;
for(i = 0; i < table->currentElements;i++) {
if(strcmp(table->array[i].name, name) == 0) {
position = i;
free(&(table->array[i].name));
free(&(table->array[i].value));
for(j = position; j < table->currentElements;j++) {
table->array[j].name = table->array[j+1].name;
table->array[j].value = table->array[j+1].value;
}
table->currentElements--;
}
}
return 0;
}
我想从表中删除一个名称,该名称作为方法中的参数传递。例如,如果我有一个像 -
这样的表1)Mat 298 Vine Street
2)Jeff 998 Vine Street
3)Sun 234 Vine Street
我将参数Mat传递给rtable_remove方法,结果表应该是
1)Jeff 998 Vine Street
2)Sun 234 Vine Street
第二个元素成为第一个元素,第三个元素成为第二个元素,依此类推。此外,我还想释放Mat占用的内存(表有两个字段名称和值,其中value是地址)。
我的代码问题似乎是我试图释放内存的方式引发了一个损坏错误。感谢您的帮助!
答案 0 :(得分:2)
两件事。 table-&gt; array [i] .name 和 table-&gt; array [i] .value 是指针,因此&amp; 不是需要
free(table->array[i].name);
free(table->array[i].value);
二。该循环应该直到 j&lt; table-&gt; currentElements - 1 not j&lt;表 - &GT; currentElements 因为您正在设置 j + 1 元素:
for(j = position; j < table->currentElements - 1; j++)
如果阵列足够大,也许不需要第二部分。
你忘记了休息声明:
...
table->currentElements--;
break; //or return 0;
...
瓦尔特