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 :

char *, string et tableau statique ou dynamique


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut char *, string et tableau statique ou dynamique
    bonjour, j'aurais qq questions sur les pointeurs. Je vous dis ce que je sais (ou crois savoir) et j'aimerais que vous me donniez votre avis.

    1) si je fais
    alors tab est un tableau à deux composantes et chaque éléments de tab est un T. Donc si T est une structure (par exemple Voiture), j'accède à ses champs par l'intermédiaire du point tab[0].pneu; tab[0].porte

    2) si je fais
    Idem que 1) sauf que chaque éléments de tab est un pointeur sur un T et donc je fais tab[0]->pneu; tab[0]->porte

    3) Là est ma question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T * tab=malloc(2*sizeof(*tab));
    et là je ne comprends pas : chaque éléments de tab est un T ou un T * ??
    tab[0] est un Voiture * ou un Voiture ?

    Pour faire simplement, voici mon code (qui marche)

    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include<stdlib.h>
    #include<stdio.h>
     
    int main()
    {
     
        char * t[2];
     
        t[0]="CH3";
        t[1]="CH4";
        t[2]="CH2";
     
        int i;
        for(i=0;i<3;++i)
    	printf("t[%d] = %s\n",i,t[i]);
     
        char **tab=malloc(3*sizeof(*tab));
     
        tab[0]=t[0];
        tab[1]=t[1];
        tab[2]=t[2];
     
        for(i=0;i<3;++i)
    	printf("tab[%d] = %s\n",i,tab[i]);
     
        free(tab);
     
        return 0;
    }
    J'ai donc 2 questions :
    1) t est un tableau de dimension 2. Pourquoi t[2] existe ? Ca devrait planter non ? Est-ce à moi de faire les tests de dépassements de tableau ? (Au vu de ce code je pense que oui). Mais est-ce que l'adresse mémoire de tab[2] pourra être effacé n'importe quand ou sera-t-elle effacée lorsque t sera détruit ?

    2) Avec mon tab, je voulais faire un tableau dynamique donc chaque composante est un char * (donc une string si j'ai bien compris).

    Au début j'avais fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *tab=malloc(3*sizeof(*tab));
    (cf ma question 3). Au vu de ce code, j'ai l'impression que tab[0] est un char et non un char* d'où mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char **tab=malloc(3*sizeof(*tab));
    où là tab[0] est un char * . Donc, d'après ce test, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Voiture *tab=malloc(3*sizeof(*tab));
    tab[0] est une Voiture (et non une Voiture *) et donc je dois faire tab[0].pneu, et si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Voiture **tab=malloc(3*sizeof(*tab));
    tab[0] est une Voiture * et donc je dois faire tab[0]->pneu.

    Est-ce correct ?

    Mais pourquoi si je fais
    tab[0] est une Voiture * et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Voiture * tab=malloc(2*sizeof(*tab)); // <=> malloc(2*sizeof(Voiture)); ??
    tab[0] est une Voiture et non une Voiture * ?

    Merci.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    3) tab est un T *, donc chaque élément de tab est un T.

    1) C'est une erreur, T[2] n'existe pas: C'est une erreur, et certains compilos seront assez malin pour te la signaler (parce que là, c'est flagrant). Si ça ne plante pas, c'est que c'est un comportement indéfini: Sur une autre archi, tu pourrais avoir une exception, sur d'autres, ça pourrait planter en quittant le main().

    2) C'est correct. Le pourquoi de la double *, c'est que les crochets équivalent (dans un tableau à une seule dimension seulement) à la dernière étoile.
    On voit ça très bien dans les paramètres de fonction:
    void Fonction(char *tabChn[]) équivaut à void Fonction(char * const tabChn)
    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.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    ok, merci de mettre un peu plus de précisons dans mes idées.

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

Discussions similaires

  1. Tableau Dynamique pointant sur Tableau Statiques
    Par ShaiLeTroll dans le forum Langage
    Réponses: 15
    Dernier message: 16/11/2009, 14h56
  2. passage d'un tableau statique à un dynamique
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/09/2009, 23h08
  3. Convertion d'un String en tableau de char.
    Par elephant13 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2008, 19h01
  4. [MySQL] Différence : tableau statique (hardcodé) et tableau dynamique (mysql) ?
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/01/2007, 16h09
  5. [Debutant]String en tableau de char
    Par amel2006 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 05/03/2006, 10h33

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