bah jsais pas alors, vu que tu t'en fous de l'ordre, pourquoi tu fais pas juste comme ca:
void remove_element(int* array, int* element_count, int removeme)
{
for (int i = 0, stop = *element_count; i < stop; i++)
{
if (array[i] == removeme)
{
array[i] = array[stop - 1];
(*element_count)--;
array = realloc(array, *element_count);
return;
}
}
}
?

c'est justement plus simple, plus rapide meme pour les petits arrays, et pas de question a se poser pour memmove ou boucle a la mano, vu que tu remove de toutes facons qu'un element a la fois

(et vu que memmove est un intrinsic sur pas mal de compilos, un memmove de taille constante connue au compile-time sera quasiment toujours plus efficace que la version generique avec un nombre d'elements variable que tu utilises)
et sinon, t'as teste le code genere par ton compilo ? t'as mesure le temps pris par les deux fonctions sur un cas d'utilisation reel?
et avec un peu de bol ton implem de realloc ne fait rien si la taille est plus petite (c'est le cas dans toutes les CRT que je connais en tout cas), donc ca ne prendra quasiment pas de temps (mais du coup ca ne sert a rien de l'appeler)