api.h で
typedef void* hidden_my_type;
void do_something(my_type x);
core.c で
struct _my_type
{
    int a;
}
void do_something(hidden_my_type void_x)
{
   struct *_my_type x = void_x;  /*Don't understand is that correct way to do, as I'm getting segmentation fault error */
   printf("Value: %d\n", x->a);
}
別の方法として、
struct *_my_type x = (struct _my_type *)malloc(sizeof(struct _my_type));
void_x = x
printf(Value: %d\n", x->a);
しかし、それでも seg-fault エラーが発生します。
さて、これが void* の問題です....
例えばcore.cで
void init_my_type(hidden_my_type a)
{
   my_type *the_a = malloc(...);
   a = the_a   // <<<<<<<<<<<<<<<<<<<<<<<<<<<< is this correct?! a is void* and the_a // is original type
   pthread_cond_init(&the_a->...);
    .. (in short any other methods for init ..)
}
void my_type_destroy(my_hidden_type x)
{
    my_type *the_x = x;
    pthread_detroy(&the_x-> ...);
}
main.c で
test()
{
   my_hidden_type x;
   init_my_type(x);
   .... 
   my_type_detroy(x);
}
これ自体は失敗するはずです。main.c テスト関数のように、x は void* です ... init は割り当てますが、destroy では再び void* を渡します .. これは何でもかまいません!
編集(私のために解決)
api.h で
typedef void* hidden_my_type;
void do_something(my_type x);
core.c で
 struct _my_type
    {
        int a;
    }
 void init_hidden_type(hidden_my_type void_p_my_type)
    {
        struct _my_type *real_my_type = (struct _my_type *)malloc(sizeof(struct _my_type));
        //--- Do init for your type ---
        void_p_my_type = real_my_type;
    }
 void do_something(hidden_my_type void_x)
    {
       struct *_my_type x = void_x; 
       printf("Value: %d\n", x->a);
    }