Block Metadata Design

1 / 5

Memory Layout

+--------+------------------------+
| Header |     User Data          |
+--------+------------------------+
^        ^
block    payload (malloc returns this)
2 / 5

Header Contents

typedef struct block_header {
    size_t size;   // Data size (not total)
    int free;      // 1=free, 0=used
    struct block_header *next;
} block_header_t;
3 / 5

Pointer Arithmetic

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);
4 / 5

Magic Numbers

Detect invalid pointers:

#define BLOCK_MAGIC 0xDEADBEEF

if (block->magic != BLOCK_MAGIC) {
    abort();  // Bad pointer!
}
5 / 5
Use arrow keys or click edges to navigate. Press H to toggle help, F for fullscreen.