如何为void数组赋值

时间:2014-05-09 21:24:13

标签: c arrays void-pointers

在发现之后,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,但我不知道这种灵活的变量类型。

1 个答案:

答案 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会自动增长数组,而不是在您尝试超越结束时报告错误。