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 :

Malloc tableau de chaine de caractere


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut Malloc tableau de chaine de caractere
    Bonjour

    Je travaille sur un projet et je ne heurte a un seg fault qui me resiste.

    Je cherche a recopier une map (carre de nb_line sur len_line) mais je n'arrive pas a mallocer un tableau a plus d'une dimension

    Voila le bout de code qui fait des siennes :

    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
    char	**declare(int nb_line, int len_line, char *path)
    {
      char	**mat;
      int	fd;
      int	x;
      int	y;
     
      y = 0;
      /*Dans cette partie je bloque*/
      while (y <= nb_line)
        {
          if((mat[y] = malloc((len_line + 1) * sizeof(*mat))) == 0)
    	{
    	  my_putstr("Error: Could not malloc\n");
    	  return (0);
    	};
          y++;
        }
      /*J'ouvre le fichier*/
      if ((fd = open(path, O_RDONLY)) <= 0)
        my_putstr("Error: File can't be open in function nb_line\n");
      /*Je passe la premiere ligne car je ne dois pas la recopier et je la traite ailleurs*/
      mat[0][0] = 2;
      while (mat[0][0] != '\n')
        if (read(fd, &mat[0][0], BUF_SIZE) <= 0)
          return (0);
      /*Je recopie ma map*/
      y = 0;
      while (y <= nb_line)
        {
          x = 0;
          while (x <= len_line)
    	{
    	  read(fd, &mat[y][x], BUF_SIZE);
    	  x++;
    	}
          y++;
        }
      close(fd);
      return (mat);
    }
    Voila si vous avez une idee ou que vous voyez une erreur (pas besoin de dire que mon code est moche ca je l'avais vu XD) n'hesitez pas a m'expliquez

    Merci

  2. #2
    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
    Citation Envoyé par firemax Voir le message
    Bonjour

    Je travaille sur un projet et je ne heurte a un seg fault qui me resiste.

    Je cherche a recopier une map (carre de nb_line sur len_line) mais je n'arrive pas a mallocer un tableau a plus d'une dimension

    Voila le bout de code qui fait des siennes :

    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
    char	**declare(int nb_line, int len_line, char *path)
    {
      char	**mat;
      int	fd;
      int	x;
      int	y;
     
      y = 0;
      /*Dans cette partie je bloque*/
      while (y <= nb_line)
        {
          if((mat[y] = malloc((len_line + 1) * sizeof(*mat))) == 0)
    	{
    	  my_putstr("Error: Could not malloc\n");
    	  return (0);
    	};
          y++;
        }
      /*J'ouvre le fichier*/
      if ((fd = open(path, O_RDONLY)) <= 0)
        my_putstr("Error: File can't be open in function nb_line\n");
      /*Je passe la premiere ligne car je ne dois pas la recopier et je la traite ailleurs*/
      mat[0][0] = 2;
      while (mat[0][0] != '\n')
        if (read(fd, &mat[0][0], BUF_SIZE) <= 0)
          return (0);
      /*Je recopie ma map*/
      y = 0;
      while (y <= nb_line)
        {
          x = 0;
          while (x <= len_line)
    	{
    	  read(fd, &mat[y][x], BUF_SIZE);
    	  x++;
    	}
          y++;
        }
      close(fd);
      return (mat);
    }
    Voila si vous avez une idee ou que vous voyez une erreur (pas besoin de dire que mon code est moche ca je l'avais vu XD) n'hesitez pas a m'expliquez

    Merci

    en dehors du seg fault, si le malloc échoue tu renvoie 0 qui est un int et non un char **

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((mat[y] = malloc((len_line + 1) * sizeof(*mat[y]))) == 0)
    2 est un int et non un char !

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par firemax
    Je cherche a recopier une map (carre de nb_line sur len_line) mais je n'arrive pas a mallocer un tableau a plus d'une dimension

    Comment allouer dynamiquement un tableau à 2 dimensions ?


  4. #4
    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
    sinon tu peux faire qqch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ** mat=malloc(N*sizeof(*mat));
    if(mat==NULL) /* erreur */
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mat[i]=strdup("ma chaine");
    avec un joli

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free(mat[i]), mat[i]=NULL;
    free(mat), mat=NULL;
    je pense que c'est encore plus simple...

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char	**declare(int nb_line, int len_line, char *path)
    {
      char	**mat;
    ...
          if((mat[y] = malloc((len_line + 1) * sizeof(*mat))) == 0)
    ...
    }
    Ton erreur est que mat n'est pas un tableau, mais un pointeur. mat[y] va donc planter si y !=0.
    - tu dois d'abord allouer un tableau de pointeur sur char et mettre l'adresse de ce tableau dans mat.
    - tu peux ensuite mettre dans chaque élément de ce tableau l'adresse des tableaux de char que tu alloues
    - dans ton malloc, le sizeof * mat est incorrect : c'est la taille d'un pointeur sur char (couramment 4) et non celle d'un char (qui vaut toujours 1)
    - Compare à NULL, pas à 0
    -En cas d'erreur d'allocation, tu devrais libérer toutes les mémoires précédemment allouées avant de retourner NULL

  6. #6
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    salut tu peux essayer celà
    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
     
    #include <stdio.h>
    #include<malloc.h>
     
    int main ()
    {
      int i;
      char	**mat;
      mat=(char**)malloc(10*(sizeof(char*)));//allouer un pointeur de pointeurs qui représentera les lignes
      for(i=0;i<10;i++)
    	mat[i]=(char*)malloc(10*sizeof(char));//allouer chaque ligne séparément
    //comme ça tu obtiens une matrice 10*10
      for(i=0;i<10;i++)
    	  free(mat[i]);//liberer chaque ligne
     
      free(mat); /liberer le pointeur des pointeurs
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par salseropom Voir le message
    en dehors du seg fault, si le malloc échoue tu renvoie 0 qui est un int et non un char **

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((mat[y] = malloc((len_line + 1) * sizeof(*mat[y]))) == 0)
    2 est un int et non un char !
    Bah pas grave pour le renvoi de 0 c'est quand meme un char qui correspond a NULL et pour le 2 ca correspond au troisieme caractere de la table ascii , c'est une valeur comme une autre pour etre sur que ma boucle puisse "demarrer"

    Mais le *mat[y] dans malloc j.avais pas vu merci

    Thanks

    Mais ca segfault toujours a cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Program received signal SIGSEGV, Segmentation fault.
    0x08048868 in declare (nb_line=9, len_line=28, path=0xbfbfe8fe "expl_map")
        at main.c:108
    108           if((mat[y] = malloc((len_line + 1) * sizeof(**mat))) == 0)

  8. #8
    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
    Citation Envoyé par firemax Voir le message
    Mais ca segfault toujours a cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Program received signal SIGSEGV, Segmentation fault.
    0x08048868 in declare (nb_line=9, len_line=28, path=0xbfbfe8fe "expl_map")
        at main.c:108
    108           if((mat[y] = malloc((len_line + 1) * sizeof(**mat))) == 0)
    je metterai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mat[y]=malloc((len_line + 1) * sizeof(*mat[y]));
    if(mat[y] == NULL) /* erreur */

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char	**declare(int nb_line, int len_line, char *path)
    {
      char	**mat;
    ...
          if((mat[y] = malloc((len_line + 1) * sizeof(*mat))) == 0)
    ...
    }
    Ton erreur est que mat n'est pas un tableau, mais un pointeur. mat[y] va donc planter si y !=0.
    - tu dois d'abord allouer un tableau de pointeur sur char et mettre l'adresse de ce tableau dans mat.
    - tu peux ensuite mettre dans chaque élément de ce tableau l'adresse des tableaux de char que tu alloues
    - dans ton malloc, le sizeof * mat est incorrect : c'est la taille d'un pointeur sur char (couramment 4) et non celle d'un char (qui vaut toujours 1)
    - Compare à NULL, pas à 0
    -En cas d'erreur d'allocation, tu devrais libérer toutes les mémoires précédemment allouées avant de retourner NULL
    Je suis un gros boulay

    Merci j'oubliais d'allouer ma 1er dimnsion a mon tableau

    Et j'avais mal fait mon deuxieme malloc aussi XD

    Now ca fonctionne thanks a tous ceux qui ont repondu

  10. #10
    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
    pense à la balise Résolu

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    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
    #include <stdio.h>
    #include <malloc.h>
    #define RAWS 10
    #define COLS 10
     
    int main (void)
    {
       int i, err = 0;
       char **mat = malloc (RAWS * sizeof * mat);
       if (mat != NULL)
       {
          for (i = 0; i < COLS; i++)
          {
             mat[i] = malloc (COLS * sizeof * mat[i]);
             if(mat[i] == NULL)
             {
                err = 1;
             }
          }
          if(err == 0)
          {
             /* ce que tu veux... */
             for(i = 0; i < COLS; i++)
                free(mat[i]), mat[i] = NULL;
             free(mat), mat = NULL;
          }  
       }
       else
       {
          err = 1;
       }
     
       return err;
    }

  12. #12
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    salut
    ne vous chamaillez pas ça marche pour les deux cas 0 ou NULL
    essayer ce 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
     
    #include <stdio.h>
    #include<malloc.h>
     
    int main ()
    {
      int i;
      char	**mat;
      if((mat=(char**)malloc(10*(sizeof(char*))))!=NULL)//allouer un pointeur de pointurs qui représentera les lignes ici on peut mettre 0 à la place de NULL
      { 
    	for(i=0;i<10;i++)
    		mat[i]=(char*)malloc(10*sizeof(char));//allouer chaque ligne séparemment
    	mat[5][5]='c';
    	printf("%c",mat[5][5]);
    	for(i=0;i<10;i++)
    	  free(mat[i]);//liberer chaque ligne
    	free(mat); //liberer le pointeur des pointeurs
      }
     
    }

  13. #13
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par archer Voir le message
    salut
    ne vous chamaillez pas ça marche pour les deux cas 0 ou NULL
    essayer ce 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
     
    #include <stdio.h>
    #include<malloc.h>
     
    int main ()
    {
      int i;
      char	**mat;
      if((mat=(char**)malloc(10*(sizeof(char*))))!=NULL)//allouer un pointeur de pointurs qui représentera les lignes ici on peut mettre 0 à la place de NULL
      { 
    	for(i=0;i<10;i++)
    		mat[i]=(char*)malloc(10*sizeof(char));//allouer chaque ligne séparemment
    	mat[5][5]='c';
    	printf("%c",mat[5][5]);
    	for(i=0;i<10;i++)
    	  free(mat[i]);//liberer chaque ligne
    	free(mat); //liberer le pointeur des pointeurs
      }
     
    }
    Il y a des cours si tu veux ici :
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    http://emmanuel-delahaye.developpez.....htm#tabdyn_2d

  14. #14
    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
    certes, ça marche pour 0 et NULL mais pour ma part, je trouve que NULL est plus "parlant" que 0...

  15. #15
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    je suis d’accords avec toi sur NULL puisqu’on traite ici des pointeurs
    mon but était seulement de mettre fin à cette dispute

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

Discussions similaires

  1. tableau de chaine de caractere avec pointeur
    Par Oussama1 dans le forum C++
    Réponses: 7
    Dernier message: 15/12/2008, 13h12
  2. Tableau de chaine de caracteres
    Par Pineau dans le forum Débuter
    Réponses: 6
    Dernier message: 30/04/2008, 11h53
  3. Réponses: 7
    Dernier message: 01/12/2006, 21h28
  4. conversion tableau vers chaine de caractere
    Par sneb5757 dans le forum Réseau
    Réponses: 6
    Dernier message: 12/11/2006, 22h31
  5. [Tableaux] tableau de chaine de caractere
    Par Tempotpo dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2006, 13h54

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