Another dynamic array implementation in C
In C, as in C++, object pointers can be freely converted to void*, so quite a few casts can be removed.
It's probably convenient to store data as a char*, since that's how we use it.  We should still use void* as external interface, of course.
This is a dangerous anti-pattern:

            p-&gt;data = realloc(p-&gt;data, VECTOR_RESERVE_SIZE);


If the realloc() fails, it returns a null pointer.  By overwriting p-&gt;data before we check for null, we leak the old value of p-&gt;data, which is no longer accessible.  And the null-check is also missing, so subsequent access is Undefined Behaviour.
Style-wise, I think I'd find (!(i &gt; p-&gt;used)) easier to read as (i &lt;= p-&gt;used).  And if (p-&gt;data != NULL) { return false; } else { return true; } as return !p-&gt;data;.
The example code should set a good example, and check the return value of vector_init() (and also vector_append() once you realise it needs to indicate success/failure) and react appropriately.  Otherwise, you'll find you're encouraging slapdash usage.