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 :

Déclaration statique d'un tableau de taille fixe de pointeurs


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut Déclaration statique d'un tableau de taille fixe de pointeurs
    Le code suivant utilise une declaration dynamique d'un tableau de 3 char* :
    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
     
    void test(char ***trois)
    {
    	(*trois)[0] = "chaine 0";
    	(*trois)[1] = "chaine 1";
    	(*trois)[2] = "chaine 2";
    }
     
    void main()
    {
    	char **ex = malloc(3 * sizeof(char *));
    	test(&ex);
    	printf("%s %s %s\n", ex[0], ex[1], ex[2]);
    	free(ex);
    }
    Je n'arrive pas à déclarer la meme chose de manière statique.
    Si mon main devient comme le code qui suit, j'ai un warning à la compilation et un segfault à l'exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void main()
    {
    	char *ex[3];
    	test(&ex);
    	printf("%s %s %s\n", ex[0], ex[1], ex[2]);
    }
    Je remercie d'avance la personne qui m'expliquera la maniere correcte de déclarer statiquement cette exemple.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Hello,

    Tu cherches à remplir la mémoire allouée par malloc(). Ta fonction n'a donc pas besoin de l'adresse de « ex », mais seulement de ce qu'elle contient (le résultat de malloc()). Tu peux donc largement simplifier ton programme en éliminant le « & » et en adoptant le même type de donnée de chaque côté.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     void test(char ** trois)
    {
    	trois[0] = "chaine 0";
    	trois[1] = "chaine 1";
    	trois[2] = "chaine 2";
    }
     
    void main()
    {
    	char **ex = malloc(3 * sizeof(char *));
    	test(ex);
    	printf("%s %s %s\n", ex[0], ex[1], ex[2]);
    	free(ex);
    }

    Ensuite, en déclarant le tableau statique, tu peux utiliser le même code car « ex » (seul) et « &ex » (seul aussi) te renverront la même valeur. Par contre, il faut penser à retirer le free() !

    Si, toutefois, le but de cet exercice est de trouver un moyen facile d'initialiser un tableau de chaînes au départ, sache que tu peux les écrire sous la forme d'un ensemble :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * ex [3] = { "chaine 1", "chaine 2", "chaine 3" };

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans l'expression test(ex), ex est du type char**.
    Par contre, &ex n'est pas un char*** parce que ex est un tableau :
    - Dans toute expression, excepté les deux seuls cas où il figure comme opérande des opérateurs unaires & ou sizeof, ex est du type "adresse d'un élément du tableau" donc char **.
    - Comme opérande des opérateurs unaires & ou sizeof, il est "tableau de 3 pointeurs sur char" : char *[3]. Par conséquent &ex est du type "adresse d'un tableau de 3 pointeurs sur char" char * (*)[3]

    C'est donc le type du paramètre de la fonction qu'il faut corriger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void test(char * (*trois)[])
    {....}
      char *ex[3];
      test(&ex)
    ....
    Si on veut garder le prototype de la fonction, alors, il faut passer par un artifice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void test(char ***trois)
    {...}
    ...
      char *ex[3];
      char ** p = ex;
      test(&p);
    ...
    Il est toutefois plus simple de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void test(char ** trois)
    {
      trois[0] = "chaine 0";
      trois[1] = "chaine 1";
      trois[2] = "chaine 2";
    }
    int main(void)
    {
      char *ex[3];
      test(ex);
      printf("%s %s %s\n", ex[0], ex[1], ex[2]);
      return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2010, 12h22
  2. Tableau HTML taille fixe
    Par shuyun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/08/2009, 15h35
  3. Déclaration statique d'un tableau de chaines
    Par ymoreau dans le forum Débuter
    Réponses: 2
    Dernier message: 07/08/2009, 13h29
  4. [HTML] Tableau avec Taille Fixe
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/05/2008, 14h42
  5. afficher descriptifs de tailles différentes dans un tableau de taille fixe
    Par poupouille dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 02/02/2008, 22h27

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