Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allocation dynamique

type de données

Sujet résolu
    25 mai 2006 à 19:17:43

    Bonjour, voilà j'avais une petite question (mais importante d'après moi ;)) à propos de l'allocation dynamique en C, détaillée dans le tutoriel correspondant.
    Voilà, dans ce code (copier-collé du tutoriel), on libère de la place correspondant à "nombreDAmis" entiers de type long certes, ce qui fait une certaine place en mémoire. Mais à aucun moment dans l'allocation on ne précise que ce seront des ENTIERS qui seront enregistrés dans cet emplacement en mémoire.
    Par la suite, on appelle dans la boucle for la i-ème case du tableau, donc cela signifie que le compilateur va deviner qu'on enregistrera des entiers dans se tableau et créer tout seul des cases de taille 4???
    L'explication que j'ai trouvée (mais je ne sais pas si elle est correcte), c'est qu'il incrémente automatiquement à chaque enregistrement de façon à ce que l'enregistrement dans tableau[i] pour un 'nouveau' i soit juste après la fin de la donnée enregistrée dans la case 'i-1' précédemment.
    Mais dans ce cas, l'adresse de la première case du tableau ne suffit plus à 'caractériser' le tableau, puisqu'il faut alors retenir la taille de chaque case de ce tableau, et dans ce cas l'équivalence "tableau[i]<=>*(tableau+i*sizeof(long))" n'est plus valable sauf "cas particuliers" (relation qui est sous une forme un peu différente réutilisée par la suite...)

    int main(int argc, char *argv[])
    {
        long nombreDAmis = 0, i = 0;
        long* ageAmis = NULL; // Ce pointeur va servir de tableau après l'appel du malloc

        // On demande le nombre d'amis à l'utilisateur
        printf("Combien d'amis avez-vous ? ");
        scanf("%ld", &nombreDAmis);

        if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p)
        {
            ageAmis = malloc(nombreDAmis * sizeof(long)); // On alloue de la mémoire pour le tableau
            if (ageAmis == NULL) // On vérifie si l'allocation a marché ou pas
            {
                exit(0); // On arrête tout
            }

            // On demande l'âge des amis un à un
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel age a l'ami numero %ld ? ", i + 1);
                scanf("%ld", &ageAmis[i]);
            }

            // On affiche les âges stockés un à un
            printf("\n\nVos amis ont les ages suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%ld ans\n", ageAmis[i]);
            }

            // On libère la mémoire allouée avec malloc, on n'en a plus besoin
            free(ageAmis);
        }

        return 0;
    }

    Voilà, j'espère que je n'ai pas mal compris ce qui a été expliqué (il faudrait peut-être l'expliquer dans le tutoriel si je (ne) me suis (pas) planté, non?), et j'attends votre lumière avec impatience ;)
    J'ai recherché désespérément sur le forum un formulaire de recherche mais je n'ai malheureusement pas eu le courage de parcourir les 89 pages à la recherche de mon sujet. Si vous pouviez aussi m'indiquer où se situe le formulaire ?
    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2006 à 19:41:45


      long* ageAmis = NULL;


      Euh :/ On lui dit pas au compilateur que c'est des longs qui sont contenu là-dedans ?!

      Et aussi, je pense que tu confonds "libérer de l'espace mémoire" avec "allouer de l'espace mémoire", ce qui sont pourtant deux choses radicalement opposées...

      J'espère avoir répondu à ta question...
      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2006 à 19:45:08

        Citation : Immae

        Bonjour, voilà j'avais une petite question (mais importante d'après moi ;)) à propos de l'allocation dynamique en C, détaillée dans le tutoriel correspondant.


        Tout ce qui concerne l'allocation dynamique est important.

        Citation : Immae


        Voilà, dans ce code (copier-collé du tutoriel), on libère de la place correspondant à "nombreDAmis" entiers de type long certes, ce qui fait une certaine place en mémoire. Mais à aucun moment dans l'allocation on ne précise que ce seront des ENTIERS qui seront enregistrés dans cet emplacement en mémoire.


        Si, mais de manière globale, sans distinction particulière. Il faut bien comprendre 2 notions fondamentales du C : Le tableau et l'allocation dynamique.

        Le tableau


        Le langage C définit un tableau ainsi :

        "Un tableau est objet composé d'une séquence d'objets identiques consécutifs en mémoire."

        J'ajoute qu'un objet est une variable.

        Pour accéder aux éléments d'un tableau (les fameux 'objets consécutifs'), il suffit d'avoir son nom et son type. Le type définit la taille des objets et le moyen d'y accéder. Les dimensions du tableau permettent aussi de calculer l'accès aux éléments de celui-ci. Ensuite, on peut utiliser la notation [index].

        Il est aussi possible de définir un pointeur ayant le même type qu'un élément du tableau, de l'initialiser avec le nom du tableau (qui a pour valeur et type l'adresse du premier élément du tabelau). La notation [index] est aussi applicable avec les pointeurs.

        Allocation dynamique


        la fonction malloc() reçoit une valeur qui est un nombre de bytes. Ce nombre est demandé par l'utilisateur. C'est la taille de l'objet qu'il veut allouer. La fonction va demander au système (les détails dépendent de l'implémetation) de réserver un bloc de cette taille, et celui-ci retourne l'adresse d'un bloc réservé, non initialisé et d'une taille au minimum égale à ce qui a été demandé (on ne connait pas la taille réelle, seule la taille demandée est connue de l'utilisateur. En cas d'impossibiblité (plus de memoire), malloc() retourne la valeur NULL, signifiant 'echec d'allocation"

        Evidemment, la valeur retournée est stockée dans un pointeur du bon type, ce qui permet l'accès aux éléments, comme expliqué ci-dessus.
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          26 mai 2006 à 17:30:08

          Merci beaucoup, je n'avais en effet pas fait attention au type du pointeur, ageAmis, qui répondait absolument à ma question et qui m'aurais évité une question finalement idiote...
          En fait je m'imaginais jusqu'alors le tableau uniquement comme un pointeur (sans type particulier) sur la première case offerte, ce qui posait le problème que j'ai énoncé ;)
          Encore merci!:)
          • Partager sur Facebook
          • Partager sur Twitter

          Allocation dynamique

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown