простой C имеет приятную особенность - указатели типа void, которые можно использовать как указатель на любой тип данных.
Но предположим, что у меня есть следующая структура:
struct token {
int type;
void *value;
};
где поле значения может указывать на массив символов, на int или что-то еще.
Поэтому при выделении нового экземпляра этой структуры мне нужно:
1) выделить память для этой структуры;
2) выделить память для значения и присвоить ее полю значения.
Мой вопрос - есть ли способы объявить « массив типа void», который может быть преобразован в любой другой тип, например указатель void?
Все, что я хочу, - это использовать «гибкий массив элементов» (описанный в 6.7.2.1 стандарта C99) с возможностью преобразования к любому типу.
Что-то вроде этого:
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;
Я предполагаю, что объявление значения token-> как Массив char или int и приведение к необходимому типу позже выполнят эту работу, но могут сбить с толку тех, кто прочтет этот код позже.