C'est parce que les deux travaillent avec des ressources globales : les structures de mémoire du tas et la console.
EDIT : le tas n'est rien d'autre qu'une sorte de structure de liste liée. Chaque malloc
o free
le modifie, donc le fait d'avoir plusieurs threads en même temps avec un accès en écriture à celui-ci endommagera sa cohérence.
EDIT2 : autre détail : on pourrait les rendre réentrants par défaut en utilisant des mutex. Mais cette approche est coûteuse, et il n'y a aucune garantie qu'ils seront toujours utilisés dans l'environnement MT.
Il y a donc deux solutions : faire 2 fonctions de bibliothèque, une réentrante et une non réentrante ou laisser la partie mutex à l'utilisateur. Ils ont choisi la seconde.
Cela peut aussi être dû au fait que les versions originales de ces fonctions n'étaient pas réentrantes et qu'elles ont été déclarées comme telles pour des raisons de compatibilité.