Я столкнулся с подобной проблемой, и мне пришлось написать набор инструкций для проекта на языке программирования. Я столкнулся с этой проблемой, потому что у меня был массив указателей на функции, чтобы функции можно было перечислять и запускать в цикле for (для таких вещей, как онлайн-справка, синтаксис и т. Д.). Например:
struct List_Str *(*InstructionSet[])(struct List_Str *ContextPrefix,struct List_Str *ContextSuffix)=
{
AAVF,Add,AddEmotions,AddEmoDebug,AddScope,...
};
Теперь вы можете легко сделать то же самое с типами char * вместо типов struct List_Str *, а затем преобразовать все данные в строковый формат, используя snprintf и atoi, atof и другие функции преобразования. Если вы делаете:
man isalpha
Здесь показано множество функций в ctype.h, которые могут дать вам идеи, как определить, какой тип данных содержится в строках.
Сворачивание всех типов в «строковый» формат обеспечивает огромную гибкость и регулярность, но автоматическое преобразование данных из строк в целые числа, числа с плавающей запятой и т. Д. Является трудным, но плодотворным после того, как подпрограммы отформатированы.
Если вы намереваетесь хранить двоичные данные, то вы не можете использовать строки, так как 0 двоичных символов могут быть внутри двоичных данных, и это сбивает с толку функции strlen. Кроме того, вы не имеете представления о длине того, что было malloc'ом после того, как оно покидает область видимости, поэтому сохраняйте длину разыменованных данных до того, как данные будут рекомендованы в первых нескольких байтах char *.
И последнее: я бы не рекомендовал хранить данные в void *, это слишком расплывчато. Я рекомендую использовать char *, так как он немного конкретнее, может содержать все, что может void *, и компилятор сообщит вам заранее, если что-то будет выглядеть подозрительно.