pointers-memory · intermediate · ~25 min
Why memmove exists, and how to implement it without UB.
Copy n bytes from one memory region to another, getting the right result even when the two regions overlap. This is exactly what the standard memmove guarantees and memcpy does not.
Implement void *my_memmove(void *dst, const void *src, size_t n) that copies n bytes from src to dst and returns dst. The result must be correct even if dst and src overlap. No main — the grader calls it.
dst and src are byte regions (they may overlap, alias, or be disjoint). n is the number of bytes to copy (may be 0).
Returns dst. After the call, dst[0..n-1] holds the original bytes of src[0..n-1].
char buf[10] = "abcdefghij";
my_memmove(buf + 2, buf, 5) -> buf becomes "ababcdehij" (forward overlap)
char buf[10] = "abcdefghij";
my_memmove(buf, buf + 2, 5) -> buf becomes "cdefgfghij" (backward overlap)
dst == src (aliased): no-op.n == 0: no-op.memcpy or memmove.Transfer exercise: apply the lesson to a complete function contract.
dst and src are byte regions (they may overlap, alias, or be disjoint). n is the number of bytes to copy (may be 0).
Returns dst. After the call, dst[0..n-1] holds the original bytes of src[0..n-1].
For n>0 both live byte regions have at least n bytes; overlap is allowed. Return original dst. NULL or n=0 is a no-op in this exercise. No library memcpy/memmove. Do not order unrelated pointers with relational comparisons.
#include <stddef.h>
void *my_memmove(void *dst, const void *src, size_t n) { /* TODO */ return dst; }
Always copying forward or using relational pointer comparison for unrelated objects.
Same pointer; either overlap direction; disjoint allocations; one byte; zero length.
O(n).
Solve this exercise in the browser editor — compile and run against the test harness, no setup required.