Я читаю C на диске ха sh код таблицы, не зная много о C или mmap
, но я знаю Golang.
Этот фрагмент кода смущает меня. Есть две структуры, подобные этой.
typedef struct HashTbl
{
void *data;
...
} HashTbl;
typedef struct Header
{
char magic[16];
size_t total;
size_t used;
} Header;
Используется mmap
для сопоставления HashTbl
data
свойство
ht->data = mmap(NULL, data_size, prot, MAP_SHARED, file, 0);
ht
тип равен HashTbl
, ht->data
будет приведен к Header
для установки значения свойства следующим образом:
Header *h = (Header *)ht->data;
strcpy(h->magic, MAGIC_STR);
h->total = 12;
h->used = 0;
Тогда эта функция:
void *hashtable_of(HashTbl *ht)
{
return (unsigned char *)ht->data + sizeof(Header);
}
использование этой функции:
uint64_t *table = (uint64_t *)hashtable_of(ht);
Я не понимаю, какова цель этой функции, заключается в том, чтобы вычислить длину значения void pointer (Header::data)
?
void pointer
в C выглядит как interface{}
в Go, что может быть приведенным к любому типу. но Go имеет обработку ошибок при выполнении приведения типов, если мы приведем тип interface{}
к неверному типу, он вернет ошибку
Но в этом коде C он преобразует Struct
-> unsigned char pointer
и объединить его с sizeof
другой структурой, что означает, что unsigned char pointer
является целым числом?!
Как это вообще возможно?