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 d'un tableau de chaîne de caractères


Sujet :

C

  1. #1
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut allocation dynamique d'un tableau de chaîne de caractères
    Bonjour,
    j'essaie de faire une allocation dynamique pour un tableau de char dont une dimension est connue (la taille des chaînes).
    Voici le code qui pose problème...où est l'erreur ? J'ai dû mal lire la FAQ mais ce code plante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char texte[100]="Ceci est une chaine de caractères.";
    char * chaine=NULL;
    long n=2, i=0;
     
    chaine=malloc(100*n*sizeof(*chaine));
    strcpy(chaine[i],texte );
    printf("%s\n",chaine[i]);
    free(chaine);

  2. #2
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Voici une méthode comment faire.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(){
            char texte[100]="Ceci est une chaine de caractères.";
            char *chaine=NULL;
     
            chaine=malloc(100*sizeof(chaine));
            if(chaine==NULL)
            {
                    perror("erreur d'allocation");
                    return 1;
            }
            strcpy(chaine,texte );
            printf("%s\n",chaine);
            free(chaine);
            return 0;
    }

  3. #3
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Oui mais c'est pour faire une allocation dynamique pour une chaîne de craractères. Mais j'aimerais faire une allocation pour un tableau de chaînes de caractères.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    ce n'est pas ce que tu disais dans ton premier post !

    Tu cherches à faire quoi exactement ?

    Si tu veux allouer dynamiquement un tableau de chaine de caractère alors tu dois commencer par allouer un tableau de pointeurs sur des char*, puis affecter à chaque pointeur alloué une nouvelle zone allouée dynamiquement sur des char.
    (un malloc de 'n' char*, puis affecter chaque char* à un malloc de char).

    Quoi qu'il en soit dans le code que tu as donné tu fais référence à (*chaine) avant qu'il ne soit alloué, tu demande donc ce qu'il y a à l'adresse NULL, donc ça plante.

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    une chaine de caractères n'est rien d'autre qu'un tableau de caractères, donc tu veux un tableaux de tableaux de caractères : Comment allouer dynamiquement un tableau à 2 dimensions ?

  6. #6
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par espadrille
    ce n'est pas ce que tu disais dans ton premier post !
    Citation Envoyé par acryline (premier post)
    Bonjour,
    j'essaie de faire une allocation dynamique pour un tableau de char dont une dimension est connue (la taille des chaînes).

    ça c'est exactement ce qui est dit dans la FAQ du C au sujet de l'allocation dynamique pour un
    tableau à deux dimensions ...c'est donc ce que j'ai fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* METHODE 2*/
    char *tab;
     
    tab = malloc ( sizeof(*tab)  *  taille * taille2);

  7. #7
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,

    une chaine de caractères n'est rien d'autre qu'un tableau de caractères, donc tu veux un tableaux de tableaux de caractères : Comment allouer dynamiquement un tableau à 2 dimensions ?
    Oui j'y suis déjà allée, mais ça ne marche pas. Je rencontre le problème dans l'application que je développe et dans le petit programme que j'ai fait pour tester l'allocation dynamique. (les quelques lignes que j'ai mis ici).

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(){
            char texte[100]="Ceci est une chaine de caractères.";
            char ** tab_chaine=NULL;
    		int i;
     
            tab_chaine=(char**)malloc(100*sizeof(char *));
     
    		for(i=0;i<100;i++)
    			tab_chaine[i]=NULL;
     
            if(tab_chaine==NULL)
            {
                    perror("erreur d'allocation");
                    return 1;
            }
     
    		i=0;
     
    		while(tab_chaine[i]!=NULL && i<100)
    			i++;
     
    		if(i<100)
    		{
                                 tab_chaine[i]=(char*)malloc(100*sizeof(char ));
                                 strcpy(tab_chaine[i],texte );
                                 printf("%s\n",tab_chaine[i]);
    		}
     
     
    		for(i=0;i<100;i++)
    			if(tab_chaine[i]!=NULL)
    				free(tab_chaine[i]);
     
            return 0;
    }
    je crois que &#231;a pourrai t aider

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par acryline
    Oui j'y suis déjà allée, mais ça ne marche pas. Je rencontre le problème dans l'application que je développe et dans le petit programme que j'ai fait pour tester l'allocation dynamique. (les quelques lignes que j'ai mis ici).
    Mais si ça marche. Tu ne penses pas qu'on publierait du code incorrect ?

    Montre le code qui ne fonctionne pas.

  10. #10
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Il est dans mon premier post. Je ne voulais pas dire que cette solution ne fonctionne pas. Je voulais dire que l'application que j'en ai faite plante.
    J'ai du faire une erreur, j'ai beau chercher, je ne la vois pas et j'aurais bien aimé que qq'un la trouve pour moi.

  11. #11
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par pitikak
    je crois que ça pourrai t aider
    Merci pitikak... je regarde demain ton code et j'essaie de l'utiliser. Je donne des news.

  12. #12
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    C'est ça que tu veux faire ?

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int
    main(void)
    {
    	char	texte[] = "Hello World !";
    	char	**tab = NULL;
    	int	err = 0;
    	int	i = 0;
     
    	/* tab contient 100 pointeurs vers des chaines de caractères */
    	tab = malloc (100 * sizeof (char *));
     
    	if (tab != NULL)
    	{
    		/* On initialise tous les pointeurs à NULL */
    		/* J'ai un doute sur cette méthode... Qqun peut confirmer ? */
    		memset (tab, 0, 100 * sizeof (char *));
     
    		for (i = 0; i < 100; i++)
    		{
    			/* Chaque pointeur est alloué avec le strict nécessaire */
    			/* Ne pas oublier le 0 de fin de chaine */
    			tab[i] = malloc (strlen (texte) + 1);
     
    			if (tab[i] != NULL)
    			{
    				strcpy (tab[i], texte);
    				printf ("%d:\t%s\n", i, tab[i]);
    			}
    			else
    			{
    				fprintf (stderr, "Erreur d'allocation (%d) !\n", i);
    				err = 1;
    			}
    		}
     
    		/* On libère les chaines de caractères */
     		for (i = 0; i < 100; i++)
    		{
    			if (tab[i] != NULL)
    				free (tab[i]);
    		}
     
    		/* On libère le tableau de pointeurs */
    		if (tab != NULL)
    			free (tab);
    	}
    	else
    	{
    		fprintf (stderr, "Erreur d'allocation !\n");
    		err = 1;
    	}
     
    	return err;
    }

  13. #13
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Merci cette méthode fonctionne
    Voilà j'édite pour vous mettre le code que j'ai écrit en prenant un peu ici et là, dans chacune des réponses. Il fonctionne chez moi.
    Ah oui j'ai fait une erreur dans mon titre je n'aurais pas dû dire "tableau de char" mais" tableau de chaîne de caractères", j'ai été trop vite

    [-mod- Corrigé.]

    Voici mon code :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    int main ()
    {
     char chaine[100];
     char **tabChaine=NULL;
     /*n est un nombre variable de chaînes
     de caractères ici n=5 par exemple*/
     int i=0,n=5;
     
    strcpy(chaine,"Une chaîne de caractères");
     
     /* Allocation de la 1er dimension */
     tabChaine=malloc(n*sizeof(*tabChaine));
     if (tabChaine!=NULL)
     {
         memset (tabChaine, 0, n * sizeof (char *));
        /*Allocation des n chaînes de caractères*/
         for (i=0;i<n;i++)
         {
           tabChaine[i]=malloc(sizeof(**tabChaine) * 100);
            if(tabChaine[i]!=NULL)
             {
                 strcpy(tabChaine[i],chaine);
                 printf("%s\n",tabChaine[i]);
             }
             else
             {
               perror("erreur d'allocation");
               return 1;
             }
         }
      //libération des chaines de caractères et du tableau de pointeurs
             for (i=0;i<n;i++)
             {
                 if (tabChaine[i]!=NULL) free(tabChaine[i]);
             }
             if (tabChaine!=NULL) free(tabChaine);
     }
     else
     {
        perror("erreur d'allocation");
        return 1;
     }
    return 0;
    }

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par acryline
    Voici mon code :
    Code incomplet :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:3: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:5: error: `NULL' undeclared (first use in this function)
    main.c:5: error: (Each undeclared identifier is reported only once
    main.c:5: error: for each function it appears in.)
    main.c:10: warning: implicit declaration of function `strcpy'
    main.c:13: warning: implicit declaration of function `malloc'
    main.c:16: warning: implicit declaration of function `memset'
    main.c:24: warning: implicit declaration of function `printf'
    main.c:28: warning: implicit declaration of function `perror'
    main.c:35: warning: implicit declaration of function `free'
    Process terminated with status 1 (0 minutes, 1 seconds)
    3 errors, 7 warnings
    Ton code est correct. Voici une version plus significative :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
     
    int main (void)
    {
       char **tabChaine = NULL;
       /*n est un nombre variable de chaînes
          de caractères ici n=5 par exemple */
       int i = 0, n = 5;
     
       /* Allocation de la 1er dimension */
       tabChaine = malloc (n * sizeof (*tabChaine));
       if (tabChaine != NULL)
       {
          /* effacement du tableau (methode portable) */
          for (i = 0; i < n; i++)
          {
             tabChaine[i] = NULL;
          }
     
          /*Allocation des n chaînes de caractères */
          for (i = 0; i < n; i++)
          {
             tabChaine[i] = malloc (sizeof (**tabChaine) * 100);
             if (tabChaine[i] != NULL)
             {
                char s[32];
                sprintf (s, "Chaine %d", i);
                strcpy (tabChaine[i], s);
             }
             else
             {
                perror ("erreur d'allocation");
                return EXIT_FAILURE;
             }
          }
     
    /* lecture du tableau */
          for (i = 0; i < n; i++)
          {
             if (tabChaine[i] != NULL)
                puts (tabChaine[i]);
          }
     
          //libération des chaines de caractères et du tableau de pointeurs
          for (i = 0; i < n; i++)
          {
             if (tabChaine[i] != NULL)
                free (tabChaine[i]);
          }
          if (tabChaine != NULL)
             free (tabChaine);
       }
       else
       {
          perror ("erreur d'allocation");
          return EXIT_FAILURE;
       }
       return EXIT_SUCCESS;
    }
    Mais il est en général de peu d'intérêt d'allouer une taille fixe. On préfère un mécanisme plus souple qui alloue le besouis exact pour la chaine de caractères. L'usage de strdup() est alors recommandé. Bien que non standard, cette fonction est POSIX.1 donc très portable. Elle est basée sur malloc(), donc la libération reste inchangée.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
     
    int main (void)
    {
       char **tabChaine = NULL;
       /*n est un nombre variable de chaînes
          de caractères ici n=5 par exemple */
       int i = 0, n = 5;
     
       /* Allocation de la 1er dimension */
       tabChaine = malloc (n * sizeof (*tabChaine));
       if (tabChaine != NULL)
       {
          /* effacement du tableau (methode portable) */
          for (i = 0; i < n; i++)
          {
             tabChaine[i] = NULL;
          }
     
          /*Allocation des n chaînes de caractères */
          for (i = 0; i < n; i++)
          {
             char s[32];
             sprintf (s, "Chaine %d", i);
             tabChaine[i] = strdup (s);
     
             if (tabChaine[i] == NULL)
             {
                perror ("erreur d'allocation");
                return EXIT_FAILURE;
             }
          }
     
    /* lecture du tableau */
          for (i = 0; i < n; i++)
          {
             if (tabChaine[i] != NULL)
                puts (tabChaine[i]);
          }
     
          //libération des chaines de caractères et du tableau de pointeurs
          for (i = 0; i < n; i++)
          {
             if (tabChaine[i] != NULL)
                free (tabChaine[i]);
          }
          if (tabChaine != NULL)
             free (tabChaine);
       }
       else
       {
          perror ("erreur d'allocation");
          return EXIT_FAILURE;
       }
       return EXIT_SUCCESS;
    }

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

Discussions similaires

  1. [debutant] allocation dynamique d'un tableau.
    Par méphistopheles dans le forum Débuter
    Réponses: 3
    Dernier message: 16/03/2007, 12h45
  2. Réponses: 2
    Dernier message: 05/03/2007, 18h37
  3. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

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