Handler for default values in a CLI flag utility library in C
Yes, there are things to improve:

if (defaults == NULL) {
    defaults = malloc(10 * sizeof(struct pair));
}

static short pos = 0;
if(pos % 10 == 0) {
    defaults = realloc(defaults, (pos + 10) * sizeof(struct pair));
}


That allocates space for 10 elements, and then re-allocates space for ten elements. What a waste of time.

Additionally, avoid sizeof(TYPE). sizeof expr is safer, and will be obviously correct.

Next, allocating memory is known to fail sometimes. So, check for that.

And finally, rework setDefault() and clearDefaults() so the latter actually only clears the defaults.

bool setDefault(const char *flagName, const char *defaultValue) {
    static short pos = 0;
    if (!defaults) pos = 0;
    if (pos % 10 == 0) {
        struct pair* temp = realloc(defaults, (pos + 10) * sizeof *temp);
        if (!temp) return false;
        defaults = temp;
    }
    ...
}

static void clearDefaults(void) {
    free(defaults);
    defaults = NULL;
}


Are you sure you want to use strncpy()? You know that's not really a string-function, but a zero-padding function?

Another interesting question is how the other functions should know how many elements are in the list. I have no idea, design something.

Also, consider being more dynamic, and just saving two pointers to independently-allocated strings in the pair-element.

And if having defaults starts as a null-pointer-value really disturbs you, just initialize it to oint to a statically-allocated null-object.