gpt4 book ai didi

c - 获取 void* 的大小以创建一个简单的通用动态分配数组 - C

转载 作者:太空狗 更新时间:2023-10-29 15:07:31 24 4
gpt4 key购买 nike

我在 C 中创建了一个简单的动态数组。

typedef struct varray_t
{
void **memory;
size_t allocated;
size_t used;
int index;
} varray;

void
varray_init(varray **array)
{
*array = (varray*) malloc (sizeof(varray));
(*array)->memory = NULL;
(*array)->allocated = 0;
(*array)->used = 0;
(*array)->index = -1;
}

void
varray_push(varray *array, void *data, size_t size)
{
if ((array->allocated - array->used) < size) {
array->memory = realloc(array->memory, array->allocated + size);
array->allocated = array->allocated + size;
}

array->used = array->used + size;
array->memory[++array->index] = data;
}

int
varray_length(varray *array)
{
return array->index + 1;
}

void
varray_clear(varray *array)
{
int i;
for(i = 0; i < varray_length(array); i++)
{
array->memory[i] = NULL;
}
array->used = 0;
array->index = -1;
}

void
varray_free(varray *array)
{
free(array->memory);
free(array);
}

void*
varray_get(varray *array, int index)
{
if (index < 0 || index > array->index)
return NULL;

return array->memory[index];
}

这工作正常。但是要将一个项目添加到数组中,调用者必须传入要添加的元素的大小。我想不出另一种方法来从传入的 void* 中获取大小。我想知道是否有更好的方法来设计 varray_push(varray *array, void *data, size_t size) 以便可以推断出 size

任何帮助都会很棒

根据建议编辑代码

我的数组将只包含指针元素。我已经根据 Blastfurnace 的建议修改了代码。新代码将使用 sizeof(void*) 并按常量比例调整内存大小,以便在插入时获得摊销的常量时间。

void
varray_push(varray *array, void *data)
{
size_t toallocate;
size_t size = sizeof(void*);
if ((array->allocated - array->used) < size) {
toallocate = array->allocated == 0 ? size : (array->allocated * 2);
array->memory = realloc(array->memory, toallocate);
array->allocated = array->allocated + toallocate;
}

array->memory[++array->index] = data;
array->used = array->used + size;
}

最佳答案

如果数组一次只包含一种类型,那么您可以将数组类型的大小存储在 varray_init 中。

此外,我的建议是,不要为每个元素分配新鲜内存,而是每次都分配恒定大小的内存,即首先为 16 个元素分配内存,然后在推送元素时发现数组已满时重新分配16 + 16 = 32 个元素。这样,您可以避免一次又一次地调用 malloc,而且对于小数据单独进行 malloc 也不是一个好主意。

编辑:在考虑了 Blastfurnace 评论之后,我觉得如果您打算存储数据而不是指向数据的指针,那么您实际上应该对数据执行 memcpy 而不是赋值。

关于c - 获取 void* 的大小以创建一个简单的通用动态分配数组 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545868/

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