从动态数组中删除元素后,我需要在memmove后重新分配吗?

M. *_*tih 6 c memory arrays pointers

我正在研究C中的ArrayList实现.ArrayList存储指针(void*),这意味着ArrayList是一个动态的指针数组.我在这里如何从ArrayList中删除一个元素:

typedef struct
{
    void* ptr; // pointer of array (beginning)
    int length; // pointer count
}ArrayList;

void ArrayList_Remove(ArrayList *list, int index)
{
    memmove(
        list->ptr + (sizeof(void*) * index),
        list->ptr + (sizeof(void*) * (index + 1)),
        (list->length - index) * sizeof(void*)
    );
    list->length--;
    // Do I need to realloc list->ptr to free space?
    // list->ptr = realloc(list->ptr, list->length * sizeof(void*));
}
Run Code Online (Sandbox Code Playgroud)

正如我在代码中评论的那样,我需要重新分配list->ptr还是memmove会这样做?

Ctx*_*Ctx 1

首先:memmove 根本不参与内存分配。它只是做它应该做的事情,移动(可能重叠的)内存部分。

在您的示例中,并非绝对有必要重新分配数组。这主要取决于是否删除了如此多的元素,以至于会有相应数量的可用空间可供重用。如果您认为这确实相关,那么下面的 realloc 语句看起来是正确的。但请记住,如果由于堆碎片问题而仅删除每个数组的几个元素,则未分配的空间可能根本无法使用。