plain C ma ładną funkcję - wskaźniki typu void, które mogą służyć jako wskaźnik do dowolnego typu danych.
Ale załóżmy, że mam następujące struktury:Tablica typu void
struct token {
int type;
void *value;
};
gdzie pole wartość może wskazywać na tablicy char lub int, lub coś innego.
Przy przydzielaniu nowej instancji tej struktury potrzebuję:
1) przydzielić pamięć dla tej struktury;
2) przydzielić pamięć dla wartości i przypisać ją do pola wartości.
Moje pytanie brzmi - czy można zadeklarować "tablicę typu void", która może być rzutowana na dowolny inny typ, np. Pustą wskazówkę?
Wszystko, czego chcę, to użycie "elastycznej tablicy elementów" (opisanej w 6.7.2.1 standardu C99) z możliwością rzutowania na dowolny typ.
coś takiego:
struct token {
int type;
void value[];
};
struct token *p = malloc(sizeof(struct token) + value_size);
memcpy(p->value, val, value_size);
...
char *ptr = token->value;
Przypuszczam deklarując token-> jako wartość int lub char tablicy i rzucając do potrzebnego typu później zrobią tej pracy, ale może być bardzo mylące dla kogoś, kto przeczyta ten kod później.
Podwójne wskaźniki? –
używając 'char []' jest w porządku imho, ponieważ 'sizeof (char) == 1' i nigdy nie będziesz zaskoczony. Możesz rozważyć makra, aby uzyskać dostęp do 'p-> value' z poprawnym typem. –