void * memset ( void * ptr, int value, size_t num );
Cette fonction fonctionne bien sur la plupart des systèmes lorsqu'elle est appliquée à un tableau de caractères. Elle fixe le premier nombre de BYTES du bloc de mémoire pointé par ptr à la valeur spécifiée (interprétée comme un char non signé). memset-C++ Référence Il opère un octet à chaque fois. Il fonctionne donc bien si vous assignez aux seconds arguments une valeur int ne dépassant pas 0xff.
Quant à votre version, le troisième argument est le nombre d'éléments du tableau, donc vous avez obtenu votre résultat. En fait, la vérité est que vous êtes supposé assigner au troisième argument le nombre d'octets que vous voulez.
La version correcte devrait donc être la suivante :
memset (arr, -1, sizeof(arr));