В этом конкретном примере функции my_init_array
не нужно знать тип структуры. Это потому, что он создает массив указателей (все NULL), а не создает массив структуры.
(Предупреждение: технически возможно, что ваша платформа - это та, где sizeof(void*)
отличается от sizeof(struct my_struct_1 *)
. См. этот ответ . Хорошая новость заключается в том, что указатели на все типы структур будут того же размера. Если вы параноик, вам следует соответствующим образом отредактировать этот код. В этом ответе я предположил, что sizeof(void*)==sizeof(struct my_struct_WHATEVER *)
. Возможно, вам лучше всего просто скопировать и вставить всю функцию три раза и написать одну функцию для каждого из три типа структуры. Здесь может помочь макрос.)
#include<stdlib.h>
enum my_type {STRUCT_1, STRUCT_2, STRUCT_3} ;
struct my_struct_1 { int x; };
struct my_struct_2 { double x; };
struct my_struct_3 { char * x; };
#define BLOCK_SIZE 10
void * my_array_init(void) {
void ** array = NULL ;
array = malloc(sizeof(*array) * BLOCK_SIZE) ;
if(array) {
int i;
for(i=0 ; i<BLOCK_SIZE ; ++i)
array[i] = NULL ;
}
return array ;
}
int main() {
struct my_struct_1 ** s1 = my_array_init();
struct my_struct_2 ** s2 = my_array_init();
struct my_struct_3 ** s3 = my_array_init();
}
Я внес много изменений в код исходного вопроса. Я думаю, что интересная строка:
array = malloc(sizeof(*array) * BLOCK_SIZE) ;
sizeof(*array)
не зависит от типа используемой структуры. array
является указателем на указатель и, следовательно, *array
является просто указателем. И размер указателя всегда одинаков. Поэтому эта строка никоим образом не должна зависеть от типа структуры. И array
может быть типа void**
.
Единственная другая интересная строка -
array[i] = NULL ;
Опять же, array[i]
это просто указатель, и мы устанавливаем его в NULL. И, следовательно, этот код не зависит от типа структуры. Именно эта строка требует, чтобы массив был void**
, а не void*