Нет, C массивы имеют постоянный размер, который должен быть известен в compiletime. Но вы можете обойти это, используя указатели и динамическое распределение.
Проблема здесь не эффективность настолько, насколько это безопасно. Кастинг не имеет стоимости исполнения во время выполнения, это всего лишь механизм для общения с компилятором, попросите его «доверять вам» и предположим, что за последовательностью бит есть определенный тип. Мы говорим о безопасности, потому что, если вы ошибаетесь, все может произойти во время выполнения.
В C (статическом языке) невозможно построить массив разных типов. То, что вы можете сделать, это построить массив определенной структуры, но удержать указатели на объекты с различными размерами. Например, если у struct есть указатель char*
, в этом случае каждый объект содержит строку одной или другой длины и, следовательно, имеет переменный размер (в терминах общей памяти, используемой во время выполнения, а не в виде непрерывного пространства).
Если вы хотите, чтобы каждый из этих объектов в себя иначе, чем другие, то вы можете подражать полиморфизм, используя массив указателей на функции, а затем добавить указатель на функцию в структуру, которая указывает на какой-либо из функций по мере необходимости.
Спасибо. Думаю, я пойду с вашим подходом. Это самое чистое и не связано с линией, подверженной ошибкам. Один последний вопрос: есть ли причина, по которой вы используете указатели внутри профсоюза? Если я прав, удаление их позволит сэкономить четыре байта (по крайней мере на x86) для каждого элемента union. Единственная причина, по которой я могу думать, это ваш цикл while, поскольку для повторения массива потребуется дополнительная встречная переменная. – user206268
Потому что в вашем OP вы сказали, что у вас есть массив указателей на разные структуры. Вы можете сделать это, используя объединение структур напрямую, хотя это может также потерять пространство, поскольку объединение будет размером с наибольший член. –