A simple implementation of a mutable String in C
Unsafe loop

This loop in string_find() is unsafe since it could read past the end of your buffer:


    while (str-&gt;data[pos] != c) ++pos;



You should add an additional check like this:

    while (pos &lt; str-&gt;length &amp;&amp; str-&gt;data[pos] != c) ++pos;


Short circuit error conditions

Rather than doing this:


 if (str != NULL) {
     // Rest of function indented
 }



it would be easier to read if you rewrote it like this:

if (str == NULL)
    return NULL;

// Rest of function, not indented


Other things

Your reallocation strategy will lead to \$O(n^2)\$ behavior when appending to long strings.  You might want to double the allocation instead of adding a fixed amount.

You might want to use size_t for your sizes and lengths instead if int, because an int might overflow at 32KB on some platforms.