memmove(s+1, s, 8); it's usually desirable that after the copy s[2] gets what s[1] had in it, not s[0] (and so on). just checking the initial pointers is fractionally cheaper than the full check for overlap, but is enough to guarantee safety. i did find that on 386 it was better to do the full check because the forward copy was much faster, and the cheap check, though safe, meant that arbitrarily many copies ended up taking the reverse-copy path, just because of malloc outcomes (say). overlapped copy was used on some architectures to set whole buffers to a value having set the first byte, but it's otherwise not usually what's desired.