Block Metadata Design
1 / 5
+--------+------------------------+
| Header | User Data |
+--------+------------------------+
^ ^
block payload (malloc returns this)
typedef struct block_header {
size_t size; // Data size (not total)
int free; // 1=free, 0=used
struct block_header *next;
} block_header_t;
Finding header from payload:
// CORRECT
block_header_t *block = (block_header_t*)ptr - 1;
// WRONG - subtracts too much!
block_header_t *block = ptr - sizeof(block_header_t);
Detect invalid pointers:
#define BLOCK_MAGIC 0xDEADBEEF
if (block->magic != BLOCK_MAGIC) {
abort(); // Bad pointer!
}