Advanced Operations

1 / 5

realloc Cases

  1. ptr == NULL -> malloc(size)
  2. size == 0 -> free(ptr), return NULL
  3. Shrinking -> return same ptr
  4. Growing -> malloc new, copy, free old
2 / 5

realloc Failure Contract

void *q = realloc(p, bigger);
if (q == NULL) {
    // p is STILL VALID!
    // Original data intact
}

Never: p = realloc(p, size);

3 / 5

calloc

void *my_calloc(size_t n, size_t size) {
    size_t total = n * size;
    // Check overflow!
    if (n && total/n != size) return NULL;

    void *p = my_malloc(total);
    if (p) memset(p, 0, total);
    return p;
}
4 / 5

memcpy for realloc

// Copy old_size bytes, not new_size!
memcpy(new_ptr, old_ptr, old_size);
5 / 5
Use arrow keys or click edges to navigate. Press H to toggle help, F for fullscreen.