Пытается использовать один блок malloc() ed для хранения в нем нескольких структур разных типов. Участники являются фиктивными для демонстрационных целей. Не допускается никаких предположений о их типе, порядке и т. Д., За исключением того, что они составляют совершенно законные C-структуры, которые являются полными (полностью известными и определенными для компилятора C). На этот раз это так, в другое время. Я за концепцией. Создайте свой собственный микс, но идея должна быть такой же - структура заголовка имеет указатели на другие структуры:C: Один блок malloced для нескольких структур разных типов.
typedef struct
{
int a;
} s1_t;
typedef struct
{
int b;
} s2_t;
typedef struct
{
int c;
} s3_t;
typedef struct
{
s1_t* s1;
s2_t* s2;
s3_t* s3;
} hdr_t;
int
main(int argc, char* argv[])
{
void* mem = malloc(sizeof(hdr_t) +
sizeof(s1_t) +
sizeof(s2_t) +
sizeof(s3_t));
hdr_t hdr = (hdr_t*)mem;
hdr->s1 = (s1_t*) (hdr + sizeof(hdr));
hdr->s2 = (s2_t*) (hdr->s1 + sizeof(s1_t));
hdr->s3 = (s3_t*) (hdr->s2 + sizeof(s2_t));
/* etc. */
}
Выше (наивный) код надежда не фрагментировать кучу с небольшим mallocs, а получить один блок для весь (известный в разное время).
Вопрос: Как можно в качестве переносного решения мне нужно вручную выровнять структуры в моей схеме?
Других слов мне нужен (псевдо-код), ALSZ = размер выравнивания для этого чипа:
mem = malloc(hdrsz + ALSZ + s1sz + ALSZ + s2sz + ALSZ + s3sz);
hdr = (hdr_t*)hdr;
s1 = align(hdr + sizeof(hdr_t), ALSZ);
s2 = align(s1 + sizeof(s1), ALSZ);
s3 = align(s2 + sizeof(s2), ALSZ);
Align (MEM, граница) моя подпрограмма для вычисления выровненного адреса.
Спасибо за ваши мысли.
Просто из любопытства: почему вы не можете использовать союз? Все это само по себе обойдется. – Jack
Союзы - это способ интерпретировать одно местоположение памяти разными способами. Его шаблон использования является «одним из». Не собираюсь работать на меня. Моя модель использования «каждый». – user1478807