gpt4 book ai didi

C 从动态数组中删除元素

转载 作者:行者123 更新时间:2023-12-04 05:38:08 26 4
gpt4 key购买 nike

我正在尝试编写等效于 remove 的内容Java 的 ArrayList在 C。

这是我的代码。它假定 index 是列表中的有效索引。

void arrayListRemove(ArrayList* list, int index){
int i;
if (arrayListSize(list)==1){
list->size = 0;
free(list->data);
list->data = NULL;
} else {
for(i=index;i<arrayListSize(list)-1;i++){
list->data[i] = list->data[i+1];
}
list->data = realloc(list->data, (arrayListSize(list) - 1) * sizeof(void*));
if (list->data != NULL){
--list->size;
} else {
exit(1);
}
}
}

这是正确的吗?

如果没有 arrayListSize(list) == 1,代码会工作吗?查看?即是否 realloc(list->data, 0)释放arrayList?我在网上看到过关于什么的相互矛盾的东西 realloc(ptr, 0)会做。

最佳答案

我会离开 arrayListSize(list) == 1案例。不依赖 realloc(ptr, 0) 的行为看起来很谨慎,它使代码更清晰,通常并使用显式 free .

还有一些注意事项:

  • 使用时 realloc ,请务必在 tmp 中捕获返回值变量。如 realloc失败,则可以返回 NULL并保持原始指针不变。通过做 ptr = realloc(ptr);您可能会在 realloc 时导致内存泄漏失败,因为您现在丢失了原始指针。而是使用这个习语:
    tmp = realloc(ptr, newSize);
    if (tmp != NULL)
    ptr = tmp;
    else handleError();
  • 是否有必要free从列表中删除它们时列表的元素?您的 data数组由指针组成,您是否通过不调用 free 来泄漏内存?关于删除的元素?自然,这在 java 实现中不是必需的。如果您的列表包含对所包含对象的唯一引用,那么您需要 free它们在删除时,或返回函数中的指针并将其留给调用者处理内存。
  • 通常不需要使用 realloc用于缩小列表,除非您在 的平台上真的内存受限,即使这样,也可能没有必要为每个已删除的列表元素收缩分配的块。更喜欢通过一个以上的元素来增加/缩小您分配的块。
  • 这确实是一个 nit,但由于这是一个 API 方法,而您使用的是 size您的数据结构成员来跟踪列表长度,您不妨使用 size贯穿始终,而不是依赖另一个 API 方法 arrayListSize .
  • 关于C 从动态数组中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11656648/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com