<p>As I understand it, when asked to reserve a larger block of memory, the realloc() function will do one of three different things:</p>

<p><code><pre>
if free contiguous block exists
    grow current block
else if sufficient memory
    allocate new memory
    copy old memory to new
    free old memory
else
    return null
</pre></code></p>

<p>Growing the current block is a very cheap operation, so this is behaviour I'd like to take advantage of.  However, if I'm reallocating memory because I want to (for example) insert a char at the start of an existing string, I don't want realloc() to copy the memory.  I'll end up copying the entire string with realloc(), then copying it again manually to free up the first array element.</p>

<p>Is it possible to determine what realloc() will do?  If so, is it possible to achieve in a cross-platform way?</p>

No
- and if you think about it, it can't work. Between you checking what it's going to do and actually doing it, another process could allocate memory.
In a multi-threaded application this can't work. Between you checking what it's going to do and actually doing it, another thread could allocate memory.
If you're worried about this sort of thing, it might be time to look at the data structures you're using to see if you can fix the problem there. Depending on how these strings are constructed, you can do so quite efficiently with a well designed buffer.