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 bitmap_size_in_bytes = DATABLOCKS / CHAR_BIT + 1; const size_t blocks_in_bytes = blocks * BLOCK_SIZE; void *memory_area = malloc(metadata_in_bytes + bitmap_size_in_bytes + blocks_in_bytes); /* FIXME: alignment! */ struct mdata *metadata = (struct mdata*) memory_area; char *bitmap = ((void*)metadata) + metadata_in_bytes; /* FIXME: alignment! */ void *datablocks = (char**)(((void*)bitmap) + bitmap_size_in_bytes); /* access i'th block: datablocks + i*BLOCK_SIZE */