human
Quelle est la différence entre faire :
```ptr = malloc (MAXELEMS * sizeof(char *));
```
ou :
```ptr = calloc (MAXELEMS, sizeof(char*));
```
Quand est-il judicieux d'utiliser calloc plutôt que malloc ou vice versa
gpt
```calloc()``` vous donne un tampon initialisé à zéro, tandis que ```malloc()``` laisse la mémoire non initialisée.
Pour les allocations importantes, la plupart des implémentations de ```calloc``` sous les systèmes d'exploitation courants obtiendront des pages connues à zéro de l'OS (par exemple via POSIX ```mmap(MAP_ANONYMOUS)``` ou Windows ```VirtualAlloc```) afin de ne pas avoir à les écrire dans l'espace utilisateur. C'est ainsi que ```malloc``` normal obtient également plus de pages de l'OS ; ```calloc``` profite simplement de la garantie de l'OS.
Cela signifie que la mémoire de ```calloc``` peut toujours être "propre" et allouée de manière paresseuse, et mappée en copie-sur-écriture vers une page physique partagée à l'échelle du système contenant des zéros. (En supposant un système avec une mémoire virtuelle.) Les effets sont visibles avec des expériences de performance sur Linux, par exemple.
Certains compilateurs peuvent même optimiser malloc + memset(0) en calloc pour vous, mais il est préférable d'utiliser directement calloc dans le code source si vous voulez de la mémoire initialisée à zéro. (Ou si vous essayiez de la pré-allouer pour éviter les fautes de page ultérieures, cette optimisation contrecarrera votre tentative.)
Si vous n'allez jamais lire la mémoire avant de l'écrire, utilisez ```malloc``` afin qu'il puisse (potentiellement) vous donner de la mémoire "sale" à partir de sa liste de libération interne au lieu d'obtenir de nouvelles pages de l'OS. (Ou au lieu de mettre à zéro un bloc de mémoire dans la liste de libération pour une petite allocation).

Les implémentations embarquées de ```calloc``` peuvent laisser à ```calloc``` lui-même le soin de mettre à zéro la mémoire s'il n'y a pas d'OS, ou s'il ne s'agit pas d'un système d'exploitation multi-utilisateur sophistiqué qui met à zéro les pages pour empêcher les fuites d'informations entre les processus.
Sur Linux embarqué, malloc pourrait ```mmap(MAP_UNINITIALIZED|MAP_ANONYMOUS)```, ce qui n'est activé que pour certains noyaux embarqués car cela est peu sécurisé sur un système multi-utilisateur.