在发现之后,C中没有模板,我决定在我的任务中使用指针数组来自己创建动态数组。
我认为这个答案可能是一个好的开始,但是,它只考虑整数数组,这完全不符合我的需要。为此,我决定将其更改为void数组。
我的结构目前看起来像这样:
typedef struct {
void *array;
size_t length; //How many spaces in array are occupied at the moment
size_t size; //How many spaces were allocated
size_t elm_size;//How large one member of the array is
} Array;
我关注的是,如何设置此类数组的元素。我计划使用我的函数array_get
来获取它们。问题是,variable[n]
运算符对void
数组毫无意义,因为此运算符表示*(variable + sizeof(variable)*n)
,而void
表示大小为零。在这一点上,您同意以下是检索元素的合法方式:
void* array_get(Array *a, size_t offset) {
if(offset>=a->used) {
println("Error: access of undefined offset in array.");
exit(1);
}
return void* (((char*)array) + offset*a->elm_size);
}
在程序中:
int retrieved_value;
retrieved_value = *((int*)array_get(&my_array, 2)); //The outer star is for dereferencing
然而,在设置元素时,我无助。
请不要认为我打算随意设置值。我知道必须首先分配一个内存。
对于那些喜欢提供有时出现在SO上的完美答案的人,我想问一下,我想问一下如何将一个成员推送到一个数组。同样,void
会在这里造成很多麻烦,请参阅:
void array_push(Array *a, void* element) {
if (a->used == a->size) {
a->size *= 2;
a->array = (int *)realloc(a->array, a->size * sizeof(int));
}
/*array set expression*/ = *(element); //Error! Can't dereference void pointer. Size unknown!
}
但是必须有一个void*
参数,以便在运行时决定数组成员的大小。所以我想知道如何将void*
投射到var_of_sizex*
。那时,我应用Array.elm_size
,但我不知道这种灵活的变量类型。
答案 0 :(得分:0)
void array_set(Array *a, size_t offset, void* new_value) {
if (offset >= a->size) {
fprintf(stderr, "Error: assigning beyond end of array.\n");
exit(1);
}
memcpy(((char*)(a->array)) + offset*a->elm_size, new_value, a->elm_size);
}
根据您的工作方式,您可能希望将realloc
逻辑从array_push
移至array_set
。因此array_set
会自动增长数组,而不是在您尝试超越结束时报告错误。