91 votes

Quand et pourquoi utiliser malloc

Je n'arrive pas à comprendre quand et pourquoi il est nécessaire d'allouer de la mémoire à l'aide de malloc .

Voici mon code :

#include <stdlib.h>

int main(int argc, const char *argv[]) {

  typedef struct {
    char *name;
    char *sex;
    int age;
  } student;

  // Now I can do two things
  student p;

  // Or
  student *ptr = (student *)malloc(sizeof(student));

  return 0;
}

Pourquoi est-il nécessaire d'allouer de la mémoire quand je peux simplement utiliser student p; ?

4 votes

Lisez un bon livre de programmation en C. Il expliquera la mémoire allouée par le tas bien mieux et plus rapidement que je ne peux le faire en quelques minutes.

3 votes

Vous devez apprendre les différences entre la mémoire de tas et la mémoire de pile, consultez cette question : stackoverflow.com/questions/79923/

5 votes

N'oubliez pas d'appeler free après malloc / calloc etc...

89voto

taskinoor Points 24438

malloc est utilisé pour l'allocation dynamique de la mémoire. Comme indiqué, il s'agit d'une allocation dynamique, ce qui signifie que vous allouez la mémoire au moment de l'exécution. Par exemple, lorsque vous ne connaissez pas la quantité de mémoire au moment de la compilation.

Un exemple devrait vous éclairer. Disons que vous savez qu'il y aura au maximum 20 étudiants. Vous pouvez donc créer un tableau avec 20 éléments statiques. Votre tableau sera capable de contenir un maximum de 20 étudiants. Mais que se passe-t-il si vous ne connaissez pas le nombre d'étudiants ? Disons que la première entrée est le nombre d'étudiants. Il peut être de 10, 20, 50 ou autre. Maintenant, vous allez prendre l'entrée n = le nombre d'étudiants au moment de l'exécution et allouer cette quantité de mémoire de façon dynamique en utilisant la fonction malloc .

Ce n'est qu'un exemple. Il existe de nombreuses situations comme celle-ci où l'allocation dynamique est nécessaire.

Jetez un coup d'œil à la page de manuel malloc(3) .

48voto

Necrolis Points 17569

Vous utilisez malloc lorsque vous devez allouer des objets qui doivent exister au-delà de la durée de vie de l'exécution du bloc actuel (où une copie sur retour serait également coûteuse), ou si vous devez allouer de la mémoire supérieure à la taille de cette pile (c'est-à-dire qu'un tableau de pile local de 3 Mo est un tableau de pile de 3 Mo). mauvais idée).

Avant C99 introduit VLAs vous avez aussi nécessaire pour effectuer l'allocation d'un tableau de taille dynamique. Cependant, elle est nécessaire pour la création de structures de données dynamiques telles que arbres , listes et files d'attente qui sont utilisés par de nombreux systèmes. Il y a probablement beaucoup d'autres raisons ; ce ne sont que quelques-unes.

21voto

ArcticPhoenix Points 189

En élargissant un peu la structure de l'exemple, considérez ceci :

#include <stdio.h>

int main(int argc, const char *argv[]) {

    typedef struct {
        char *name;
        char *sex;
        char *insurance;
        int age;
        int yearInSchool;
        float tuitionDue;
    } student;

    // Now I can do two things
    student p;

    // Or
    student *p = malloc(sizeof *p);
}

Le C est un langage qui passe implicitement par valeur, plutôt que par référence. Dans cet exemple, si nous transmettons 'p' à une fonction pour l'utiliser, nous créons une copie de la structure entière. Cela utilise de la mémoire supplémentaire (le total de l'espace nécessaire à cette structure particulière), est plus lent et n'est potentiellement pas très évolutif (nous y reviendrons dans une minute). Cependant, en passant *p, nous ne passons pas la structure entière. Nous passons seulement une adresse en mémoire qui fait référence à cette structure. La quantité de données transmises est plus petite (taille d'un pointeur), et donc l'opération est plus rapide.

Maintenant, sachant cela, imaginez un programme (comme un système d'information pour les étudiants) qui devra créer et gérer un ensemble d'enregistrements de plusieurs milliers, voire dizaines de milliers. Si vous passez toute la structure par valeur, il faudra plus de temps pour opérer sur un ensemble de données, que si vous passez simplement un pointeur à chaque enregistrement.

12voto

Daksh Shah Points 1434

Essayons d'aborder cette question en considérant différents aspects.

Taille

malloc vous permet d'allouer des espaces mémoire beaucoup plus grands que ceux alloués simplement en utilisant student p; o int x[n]; . La raison étant malloc alloue l'espace sur le tas tandis que l'autre l'alloue sur la pile.

Le langage de programmation C gère la mémoire de manière statique, automatique ou dynamique. Les variables à durée statique sont allouées dans la mémoire principale, généralement avec le code exécutable du programme, et persistent pendant toute la durée de vie du programme ; les variables à durée automatique sont allouées sur la pile et vont et viennent au gré des appels et retours de fonctions. Pour les variables à durée statique et automatique, la taille de l'allocation doit être constante au moment de la compilation (sauf dans le cas des tableaux automatiques à longueur variable [5]). Si la taille requise n'est pas connue avant l'exécution (par exemple, si des données de taille arbitraire sont lues depuis l'utilisateur ou depuis un fichier sur disque), l'utilisation d'objets de données de taille fixe est inadéquate. ( de Wikipedia )

Portée

Normalement, les variables déclarées devraient être supprimées/libérées après le bloc dans lequel elles sont déclarées (elles sont déclarées sur la pile). D'autre part, les variables dont la mémoire est allouée à l'aide de la fonction malloc restent jusqu'à ce qu'ils soient libérés manuellement.

Cela signifie également qu'il n'est pas possible de créer une variable/un tableau/une structure dans une fonction et de renvoyer son adresse (car la mémoire vers laquelle elle pointe pourrait être libérée). Le compilateur essaie également de vous avertir à ce sujet en donnant l'avertissement suivant :

Avertissement - l'adresse de la mémoire de la pile associée à la variable locale 'matches' est retournée.

Pour plus de détails, lisez ceci .

Modification de la taille ( realloc )

Comme vous l'avez peut-être deviné, ce n'est pas possible par la voie normale.

Détection des erreurs

Dans le cas où la mémoire ne peut pas être allouée : la méthode normale peut provoquer l'arrêt de votre programme alors que malloc retournera un NULL qui peuvent facilement être capturés et traités dans votre programme.

Modifier le contenu de la chaîne à l'avenir

Si vous créez le stockage d'une chaîne comme char *some_memory = "Hello World"; vous ne pouvez pas faire some_memory[0] = 'h'; car elle est stockée en tant que constante de chaîne et la mémoire dans laquelle elle est stockée est en lecture seule. Si vous utilisez plutôt malloc, vous pouvez modifier le contenu ultérieurement. Pour plus d'informations, vérifier cette réponse .

Pour plus de détails sur les tableaux à taille variable, consultez le site Web de la Commission européenne. regardez ceci .

6voto

Big Fat Pig Points 602

malloc = ALLOCATION de la mémoire .

Si vous êtes passé par d'autres langages de programmation, vous avez peut-être utilisé la fonction new mot-clé.

Malloc fait exactement la même chose en C. Il prend un paramètre, la taille de la mémoire qui doit être allouée et il renvoie une variable pointeur qui pointe vers le premier bloc de mémoire du bloc de mémoire entier, que vous avez créé dans la mémoire. Exemple

int *p = malloc(sizeof(*p)*10);

Maintenant, *p pointera sur le premier bloc des 10 blocs entiers consécutifs réservés en mémoire.

Vous pouvez parcourir chaque bloc en utilisant la fonction ++ y -- opérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X