IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Allocation dynamique de mémoire en langage C [Tutoriel]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut Allocation dynamique de mémoire en langage C
    Bonjour,

    Vous pouvez postez ici vos avis, remarques, suggestions sur l'article suivant :

    http://rperrot.developpez.com/articles/c/allocationC/

    NB: Merci de lire ce message avant de poster.

  2. #2
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    Bonsoir,

    Juste pour vous signaler une petite erreur dans un code de votre tutoriel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int * tabentier;
    /* Création d'un tableau de 3 entiers */
    tabentier = calloc ( 3 , sizeof(int) );
     
    tabentier[0] = 1;
    tabentier[1] = 2;
    tabentier[2] = 3;
     
    /* Ajout d'un element au tableau */
    tabentier = realloc (tabentier, 4 * sizeof(int) );
     
    tabentier[3] = 4;
     
    for ( i = 0 ; i < 3 ; i++ )
    {
         printf(" tabentier[%d] = %d \n", i , tabentier[i] );
    }
    La condition de la boucle for est mauvaise : elle s’arrêtera au troisième élément du tableau, et n'affichera donc pas tabentier[3] = 4, comme attendu.

    Merci.
    Bonne continuation,
    neow_

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 1
    Par défaut
    Citation Envoyé par neow_ Voir le message
    Bonsoir,

    la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int * tabentier;
    /* Création d'un tableau de 3 entiers */
    tabentier = calloc ( 3 , sizeof(int) );
     
    tabentier[0] = 1;
    tabentier[1] = 2;
    tabentier[2] = 3;
     
    /* Ajout d'un element au tableau */
    tabentier = realloc (tabentier, 4 * sizeof(int) );
     
    tabentier[3] = 4;
     
    for ( i = 0 ; i < 4 ; i++ )
    {
         printf(" tabentier[%d] = %d \n", i , tabentier[i] );
    }
    maintenant la boucle s'amarche bien !

    Bonne chance,
    neow_

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je trouve le tutoriel excellent. Cependant, il y a un problème avec les macros MALLOC, CALLOC et REALLOC. Prenons ce code tiré du tutoriel par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    int ** matrice , i;         /* un tableau à deux dimension */
     
    /*allocation d'un tableau de trois tableaux d'entiers */
    MALLOC(matrice,int*,3);    
     
    for ( i = 0 ; i < 3 ; i ++ )
    {
         /* allocation d'un tableau de tableau */
         CALLOC(matrice[i],int,3); 
    }
     
    /*remplissage d'une matrice diagonale*/
    for ( i = 0 ; i < 3 ; i++ )
    {
          matrice[i][i] = 1;
    }
     
    for(i = 0 ; i<3 ; i++)
    {
         FREE(matrice[i]);
    }
    FREE(matrice);
    Si CALLOC echoue disons alors qu'on en est à i = 2, matrice[2] va certes être libéré mais le programme se termine tout de suite : matrice[1], matrice[0] et matrice n'ont pas été libérés ! Il faut donc soit les retirer du tutoriel, soit les corriger.

  5. #5
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    minfo21 > Merci, mais j'avais déjà résolu le problème, c'était juste pour signaler l'erreur.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Je trouve ce didacticiel de très bonne qualité. Je reste toutefois sur ma fin par rapport aux macros proposées dans la section 4.2 qui cachent des exit() sauvages qui ne me plaisent pas. L'utilisation de tels points de sortie est certes souvent utilisé dans un contexte d'enseignement. Il y a toutefois certainement de meilleures façons de traiter ce type d'erreurs d'allocation dynamiques de mémoire dans la vraie vie. C'est à priori à mon avis une mauvaise pratique et je me demande s'il est opportun en tout cas de cacher ces points de sortie dans une macro. Typiquement, dans une fonction de création de matrice, ma stratégie sera, en cas d'erreur d'allocation, de faire le ménage (i.e. libérer tout ce qui a été allouer), puis de faire remonter l'erreur d'allocation, éventuellement jusqu'à main() qui sera la seule fonction autorisée à quitter l'application.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Par défaut
    Par medinoc

    Si realloc() ne retourne ni NULL ni tabentier, ça veut dire:
    1. Le pointeur retourné pointe sur le buffer voulu,
    2. tabentier n'est plus un pointeur valide (realloc() a fait un free() dessus).
    Je comprends beaucoup mieux. J'en conclue donc que PRomu@ld avait fait le bon choix et je rectifierais en conséquence cette erreur que je fais souvent dans mes codes avec realloc. Bonne soirée à vous !

Discussions similaires

  1. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  2. Allocation dynamique de mémoire : Limitations ?
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 22/03/2006, 17h03
  3. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  4. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo