Meilleure réponse
Je suppose que vous savez que lorsque vous exécutez un programme C, vous avez 3 fichiers ouverts, dont deux sont nommés STDOUT et STDERR, les messages normaux vont dans stdout, (cest-à-dire lorsque vous appelez printf), et les messages derreur dans stderr (lorsque vous appelez par exemple fprintf (stderr, …), ces deux (fichiers ouverts en fait) sont directement liés par votre OS vers votre terminal, quil sagisse dun terminal Unix ou dun terminal Windows. La caractéristique la plus importante dentre eux est quils peuvent être redirigés, par exemple sous Unix lorsque vous faites: ls | grep file.txt le shell redirige stdout dans « ls » et maintenant la destination de cette sortie est STDIN dans le processus « grep », donc grep peut rechercher des modèles dans ce flux, etc. Cest un truc puissant, de nombreux filtres Unix (programmes en fait) sont construits de cette manière, ce qui est puissant.
EDIT: ajoutez un exemple plus significatif Permettez-moi dajouter une nouvelle utilisation plus explicite de la redirection afin que vous puissiez saisir la chose avec un exemple plus significatif, regardez cette commande:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Ici, curl commence à télécharger wget depuis le projet GNU, tandis que curl télécharge les données quil écrit sur STDOUT, mais le shell a redirigé stdout de curl vers stdin de xzat, le shell fait le idem, redirige le stdout de xzcat vers stdin de tar, et tar commence à décompresser les données, étonnant!
Réponse
Tout dabord, un principe général: quoi que vous fassiez, malloc()
nest jamais invoqué automatiquement.
Lorsque vous déclarez un struct
, vous déclarez un type. Un type, par lui-même, ne consomme pas de mémoire à lexécution.
Lorsque vous déclarez une variable de type struct, de la mémoire lui est allouée, mais sans utiliser malloc()
. Si la variable est locale à une fonction, sa mémoire est généralement allouée sur la pile. Cest en partie ce qui rend la récursivité possible en C: chaque fois que vous appelez la fonction (même si elle est appelée de lintérieur delle-même), le pointeur de pile est ajusté et un nouvel espace est réservé sur la pile pour le loc toutes les variables de cette fonction, et à chaque fois que la fonction est quittée, la pile est «déroulée», avec tout cet espace libéré.
Lorsque vous déclarez une variable globale, une allocation statique est faite pour elle sur le tas au démarrage du programme et la variable reste disponible tout au long de lexécution du programme. La taille de tas requise est connue au moment de la compilation.
En revanche, lorsque vous utilisez malloc()
, la mémoire est allouée dynamiquement au moment de lexécution au programme par le système dexploitation et vous êtes responsable de le libérer en utilisant free()
, ou votre programme (surtout sil sagit dun programme qui sexécute pendant une longue période sans redémarrage, par exemple, une application de service) souffrira dun fuite de mémoire, affectant les performances et, dans un cas extrême, affamant tout le système de ressources. Lutilisation de malloc()
est la plus appropriée lorsque soit a) la quantité de mémoire requise est supérieure à celle qui peut être allouée sur le tas ou la pile, ou b) la quantité de mémoire requise nest pas connu à lavance.