【发布时间】:2016-04-02 05:10:42
【问题描述】:
我正在使用 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*));
}
正如我在代码中评论的那样,我需要重新分配list->ptr 或memmove 吗?
【问题讨论】:
-
注意:不能对
void *的类型应用指针运算。 -
@BLUEPIXY 那么如何通过偏移量获取指针呢?也许是指针数组(
void**)? -
使用GCC的扩展是没有问题的。通常它会转换为
char*。是的,如果void **p = malloc(size * sizeof(void*)); -
如果使用
void**,(sizeof(void*)除外)sizeof(void*) * index-->index -
一种常见的模式是跟踪长度和分配的长度。添加元素时,只要长度和分配的长度相等,才需要重新分配。当你删除一个元素时,你可以选择是否重新分配,通常你只会重新分配分配的长度比使用的长度大很多。