const size_t MAXMESSAGES = 200; const size_t MESSAGE_SIZE = 160; const size_t BLOCK_SIZE = 64; const size_t BLOCKS_PER_MESSAGE = MESSAGE_SIZE / BLOCK_SIZE + 1; const size_t BLOCKS = MAXMESSAGE * BLOCKS_PER_MESSAGE; const size_t metadata_in_bytes = sizeof(mdata) * MAXMESSAGES; const size_t bitfield_size_in_bytes = DATABLOCKS / CHAR_BIT + 1; const size_t blocks_in_bytes = blocks * BLOCK_SIZE; void *memory_area = malloc(metadata_in_bytes + bitfield_size_in_bytes + blocks_in_bytes); /* FIXME: alignment! */ struct mdata *metadata = (struct mdata*) memory_area; char *bitfield = metadata + metadata_in_bytes; /* FIXME: alignment! */ char **datablocks = (char**)(bitfield + bitfield_in_bytes); for (size_t i = 1; i != BLOCKS; ++i) datablocks[i] = ((void*)datablocks[i-1]) + BLOCK_SIZE;