Моя структура выглядит так:
struct tlv_msg
{
uint8_t datatype; //type of data
/* data stored in a union */
union{
int32_t s32val; /* int */
int64_t s64val; /* long long */
uint32_t u32val; /* unsigned int */
uint64_t u64val; /* unsigned long long */
char* strval; /* string */
unsigned char* binval; /* any binary data */
};
uint32_t bytelen; /* no. bytes of union/data part */
};
Эта структура использует объединение для хранения различных типов данных. У меня есть функция alloc, которая выделяет память для структуры в куче. Правильно ли я считаю, что если я выделяю целочисленный тип (т. Е. Первые четыре типа, перечисленные выше в объединении), мне нужно выделить только следующее:
tlv_msg* msg = malloc(sizeof(tlv_msg));
sizeof (tlv_msg) возвращает 24. Я предполагаю, что этого достаточно, чтобы вместить самый большой тип данных в объединении плюс другие члены данных. (не уверен, почему 24 - кто-то может объяснить?).
Но если тип данных для хранения является указателем, например, char *, тогда мне также нужно сделать следующее:
msg->strval = (char*)malloc(sizeof(string_length+1);
Это имело бы смысл для меня, и это, кажется, работает, но просто хотел проверить.