我有一个 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) 藤街 298 号
2) 杰夫藤街 998 号
3) 太阳藤街 234 号
然后我将参数 Mat 传递给 rtable_remove 方法,结果表应该是
1) 杰夫藤街 998 号
2) 太阳藤街 234 号
第二个元素变成第一个,第三个变成第二个,依此类推。此外,我还想释放 Mat 占用的内存(表中有两个字段 name 和 value,其中 value 是地址)。
我的代码的问题似乎是我尝试释放内存的方式引发了损坏错误。感谢您的帮助!
最佳答案
两件事。 table->array[i].name 和 table->array[i].value 是指针,所以不需要 & p>
free(table->array[i].name);
free(table->array[i].value);
其次。循环应该直到 j < table->currentElements - 1 而不是 j < table->currentElements 因为您正在设置 j + 1 元素:
for(j = position; j < table->currentElements - 1; j++)
如果数组足够大,也许不需要第二部分。
你忘记了 break 语句:
...
table->currentElements--;
break; //or return 0;
...
瓦尔特
关于c - 从表中删除元素(c 程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25954964/