从表中删除元素(c程序)

时间:2014-09-21 01:41:07

标签: c arrays pointers

我有一个方法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是地址)。

我的代码问题似乎是我试图释放内存的方式引发了一个损坏错误。感谢您的帮助!

1 个答案:

答案 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;
...

瓦尔特