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

标签 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) 藤街 298 号

2) 杰夫藤街 998 号

3) 太阳藤街 234 号

然后我将参数 Mat 传递给 rtable_remove 方法,结果表应该是

1) 杰夫藤街 998 号

2) 太阳藤街 234 号

第二个元素变成第一个,第三个变成第二个,依此类推。此外,我还想释放 Mat 占用的内存(表中有两个字段 name 和 value,其中 value 是地址)。

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

最佳答案

两件事。 table->array[i].nametable->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/

相关文章:

c - 如何将数组放入结构体中? (在C中)

python - python 中 __init__ 之外的 libSBML 段错误

c - 将带有uint16索引的AVX2字节收集到__m256i中

php - MYSQL查询复制行

c - K&R C 函数指针

c - 使用正常退出管理可变数量的工作线程

javascript - 通过 AJAX 传递给 PHP 时,传递多维数组会增加其长度

c - strcpy 和数组的意外行为

c - 在 C 中访问和修改字符串 (char*) 数组时出现段错误

带指针的 C++ 默认参数