Если вам нужна полностью универсальная функция, которая будет устанавливать для массива объектов значения, определенные неким «шаблоном» объекта, вы можете использовать функцию, подобную следующей:
void init_array( void* arr, size_t nmemb, size_t size, void const* initializer)
{
size_t i = 0;
char* p = (char *) arr;
for (i = 0; i < nmemb; ++i) {
memcpy( p, initializer, size);
p += size;
}
}
Тогда ваше распределение /Код инициализации может выглядеть следующим образом:
typedef void* slot_t;
static const slot_t empty_slot = NULL; // or make this a global if that
// works better for your scenario
int n = 10;
// note: your original `malloc()` line:
//
// slot_t slots[] = (slot_t[])malloc(sizeof(slot_t)*n)
//
// wouldn't work, as you can't assign to an array as a whole.
// That line shouldn't even compile.
slot_t* slots = (slot_t*)malloc(sizeof(slot_t)*n);
// completely generic initialization
init_array( slots, n, sizeof(slot_t), &empty_slot);
Если вы хотите инициализировать массив указателей, у вас может быть другая функция, которая обрабатывает этот случай немного более непосредственно:
void init_ptr_array( void* arr, size_t nmemb, void* initializer)
{
size_t i = 0;
void* p;
for (; p < arr + nmemb; ++p) {
*p = initializer;
}
}
// arrays of object pointers
init_ptr_array( slots, n, empty_slot);
I 'Я не уверен, что мне нравится, что две функции имеют слегка различное значение для последнего параметра.Если бы у меня была потребность в обоих видах инициализации в моей программе, я бы, вероятно, остановился на использовании общего для инициализации массивов указателей.Это может быть немного менее эффективно, но инициализация обычно не является узким местом.