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 tableau de pointeur


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Allocation tableau de pointeur
    Bonjour !

    Voilà je me posais une question. Est-ce que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
     * I : tab -> un tableau de pointeur
     * O : aucun
     * P : fonction qui alloue au tableau NB_MAX_MENU * 40 octets au tableau
     **/
    void allouer(char** tab)
    {
      int i;
      for(i = 0; i < NB_MAX_MENU; i++)
        tab[i] = malloc(40 * sizeof(char));
    }
    est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void allouer(char** tab)
    {
      tab = malloc(40 * NB_MAX_MENU * sizeof(char));
    }
    ?

    Le tableau de pointeur envoyé est dans le premier cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* texte[NB_MAX_MENU];
    et dans le deuxieme cas :
    Merci de vos réponse !


    Edit : Par équivalent, j'entends au niveau de la gestion de mon programme, pas au niveau de la représentation en mémoire.


    Cordialement,
    Kev

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Non ce n'est pas pareil (à la fois en mémoire et pour ton programme)

    Citation Envoyé par kaikait Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
     * I : tab -> un tableau de pointeur
     * O : aucun
     * P : fonction qui alloue au tableau NB_MAX_MENU * 40 octets au tableau
     **/
    void allouer(char** tab)
    {
      int i;
      for(i = 0; i < NB_MAX_MENU; i++)
        tab[i] = malloc(40 * sizeof(char));
    }
    Dans ce cas, tu sous-entends (ce qui est dangeureux) que le parametre est faite de type "char* tab [NB_MAX_MENU]".
    Ceci dit, tu alloues pour chaque entrer de ton tableau de chaine de caractere, une chaine de caractere de longueur 40.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void allouer(char** tab)
    {
      tab = malloc(40 * NB_MAX_MENU * sizeof(char));
    }
    Dans ce cas tu alloues une chaine de caractere de longueur 40*NB_MAX_MENU... et encore si tu n'as pas fait de segfault avant...

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut
    Pour bien allouer un tableau, tu doi allouer la taille du "gros" tableau autant de fois qu'il y a d'elements, puis allouer de la memoire pour tout les "sous-tableaux". En gros, il ne faut pas faire soit l'un soit l'autre parmi ce que tu proposes, mais les deux (avec quelques modifications).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void allouer(char** tab)
    {
       int  i;
       tab = malloc(([nombre d'elements] + 1) * sizeof(char*));
       for (i = 0 ; i <= [nombre d'element] ; i++)
            tab[i] = malloc(([longueur de la chaine] + 1)* sizeof(char));
        tab[i] = NULL;
    }
    Les +1 sont la pour reserver un espace memoire en plus pour mettre un '\0' a la fin.
    La petite astuce si tu veux pas te melanger dans les sizeof, tu ecris * + l'element que tu malloc.
    Par exemple :
    Malloc tab -> sizeof(*tab) (cela va donc automatiquement allouer un char *)
    Malloc tab[i] -> sizeof(*tab[i]) (cela va automatiquement allouer un char).
    Si ta fonction est rattache a un projet, n'oublie pas de return (tab).

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu n'as pas l'intention de redimensionner ton tableau après l'avoir alloué, un truc de ce genre peut être utile:
    http://www.developpez.net/forums/d28...c/#post1816773
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Si ça peut aider quelqu'un, on m'a pil poil ce que je cherchais répondu :

    Si tu veux faire l'équivalent, contigue en mémoire il faut allouer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc((NB_MAX_MENU + 40 * NB_MAX_MENU) * sizeof(char));
    Et mettre, pour (0<=i<NB_MAX_MENU), tab[i] = &tab[NB_MAX_MENU + 40*i];
    J'avais trouvé une autre solution à mon problème et je n'ai donc pas testé ceci, mais cela me semble crédible.


    Merci,
    Kev

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Allocation dynamique d'un tableau de pointeur
    Par Général03 dans le forum Débuter
    Réponses: 20
    Dernier message: 09/12/2009, 18h21
  2. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 10h57
  3. allocation dynamique d'un tableau de pointeurs
    Par Dilettante dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2007, 23h41
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. Réponses: 13
    Dernier message: 01/10/2006, 00h25

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