Bonjour,
Il n'y a pas besoin de comprendre en profondeur ce que font malloc/calloc ou autre pour pouvoir les utiliser convenablement. La réponse de jlliagre est correct. Je souhaitais juste préciser une chose :
malloc,calloc,realloc,free, sont des appels systèmes. Cela veut dire qu'à un moment ou un autre de leur exécution, ils vont parler avec le système (le noyau) et il faut savoir que parler avec le noyau, cela prend un temps un peu plus grand, que les simples fonctions du C (non systèmes, comme
sqrt, par exemple). Pour le moment, vous n'en avez que faire, du temps que cela prend, mais il faut le savoir pour plus tard (et lors de développement de programme réactif).
Maintenant, qu'est ce qu'elle font ?
Simplement, prenons malloc (calloc, c'est schématiquement la même chose avec un memset en plus (pour mettre la mémoire à zéro), realloc, c'est un malloc spécial, qui peut faire aussi un memcpy).
Malloc dit :
"Bonjour Monsieur le système, j'ai besoin de N octets"
Le système, qui est une sorte de vieux barbu très strict et ordonné va voir dans son index permettant de savoir ce qu'il a en mémoire, si a la place et donc, s'il peut répondre à la demande. Si oui, il retourne un pointeur pour indiquer l'emplacement de la mémoire utilisable. Si non, il retourne NULL (ou il tue le programme
(ouep, c'est un vieux barbu aigri))
En théorie, on a la mémoire, le programme peut continuer tranquillement.
Pour le free, c'est :
"Bonjour Monsieur le système, voici la mémoire que vous m'aviez donné, j'en ai plus besoin".
"Le système dit ok, et on continue le programme"
Maintenant, j'ai parlé d'un index, qui trace les allocations et utilisations de la mémoire. Cet index existe vraiment et est géré par le système. En soit, c'est souvent une liste chainées, qui traque toutes les allocations. Pour chaque allocation, on sauvegarde l'emplacement en mémoire de la zone alloué, la taille, et surement le système garde aussi un identifiant pour connaître le propriétaire. (Ce qui permettra, lorsqu'un autre programme essaie d'accéder à une zone mémoire qui n'est pas à lui, de lui faire une erreur de segmentation). Après, il existe des algorithmes plus ou moins poussé, qui permettent de gérer les allocations (où les placer, comment utiliser la mémoire finalement libérée et comment gérer la fragmentation).
Voilà, un peu plus en détails, mais c'est détails sont optionnels. Il faut juste comprendre que malloc demande de la mémoire au système et free, la libère. Un bon programme est un programme qui libère toute la mémoire qu'il a pris, c'est pour ça qu'une règle est de dire : pour un malloc, il faut faire un free.
Partager