Malloc d'un tableau double entree

J'ai un souci avec le prog ci dessou.En fait apres avoir mon malloc , j'essaie de stocker des valeurs , mais ca fait un segmentation fault , et je vois pas pk.Je doute de mon malloc , mais si il est faux , comment dois-je le faire ?

#include <fcntl.h>
#include <unistd.h>

typedef struct s_data
{
int nbline;
int nbchar;
int fd1;
int test2;
char **tab;
} t_data;

int my_get_line(char *file, t_data dat)
{
int line;
char *buff;

...
return (line);
}

int my_get_char(char *file, t_data dat)
{
int chars;
char *buff;

return (chars);
}

void stocktab(char *file, t_data dat)
{
char buff[1];
int x;
int y;

## ARRIVE LA CA SEGFAULTE ##

**dat.tab = 0;
#OU

dat.tab[0][0] = 0;

#######
}

int main(int ac, char **av)
{
t_data dat;

dat.fd1 = open(av[1], O_RDONLY);
dat.nbline = my_get_line(av[1], dat);
dat.nbchar = my_get_char(av[1], dat);
dat.tab = malloc((dat.nbline * dat.nbchar) * sizeof(**dat.tab));
stocktab(av[1], dat);
}

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. bonjour,
    1- au lieu de :
    dat.tab = malloc((dat.nbline * dat.nbchar) * sizeof(**dat.tab));

    2- essaies :
    dat.tab = (char**)malloc(dat.nbline * dat.nbchar * sizeof(*char));

    3- dans ta fonction main :
    a- le 2° argument est un double pointeur( char **av )
    b- tandis que tu le passes en 1° argument pour les autres fonctions
    c- mieux vaut respecter l'ordre des passages

    d- en plus ce premier argument pour les autres fonctions, est un simple pointeur( char *file )
    e- il faut passer des arguments du même type d'une fonction à une autre

    4- Dans ta fonction " stocktab " il y une mise à zero :
    ::: **dat.tab = 0; : non pour les doubles étoiles
    ::: dat.tab[0][0] = 0; : non car ce n'est pas un tableau à 2 dimensions

    5- essaies : dat.tab[0] = NULL;
    ::: c'est un tableau de pointeurs sur des pointeurs

    6- en ce qui concerne " dat.fd1 = open(av[1], O_RDONLY); "
    il me semble que " open " c'est pour ouvrir des fichiers..
    tandis qu'ici on a un tableau " av[1] ".
    je ne saisis pas exactement ce que tu veux faire..
    donc je n'ai pas d'idée..

    7- j'espère que ça aide..
    1. très bien ..

      la chose est simple :
      1- ecrire un entier type " int " dans un fichier texte : "save.txt"
      2- relire ce même entier dans un seconde temps pour s'en servir..

      1-
      a- pour ecrire : voici mon code :
      void WriteToFile( int a = 1234)
      {
      FILE *ff;
      ff = fopen("save.txt", "w");

      char st[5];
      itoa(a, st, 10);
      fwrite (st , 1 , 4 , ff);
      fclose(ff);
      }

      b- le probleme c'est que ça efface le contenu de tout mon fichier save, et je voudrais ajouter uniquement au début en effaçant la première ligne..

      2-
      a- pou lire : voici mon code :
      void ReadFile(int b = 0)
      {
      FILE *fread;
      fread = fopen("save.txt", "r");

      char Txt[255];
      fgets(Txt, 255, fread);
      b = atoi(Txt);
      fclose(fread);
      }

      une idée ?..
      merci...
      1. désolé, je me suis trompé de section..
        je sais pas pourquoi j'ai reçu une réponse sur ce message..
        en pensant que ça concernait mon message, je ai répondu..
        une erreur..
        désolé encoe..
        1. La ligne contenant le malloc effectivement me semble bizarre. Mais l'erreur principale de ce programme c'est que deux "*" devant une variable ne signifie pas tableau a deux dimension mais poiteur poitant sur un autre pointeur. Donc, il suffit d'une seul étoile. C'est probalement pour ca que ton programme plante a l'éxecution (et pas a la compilation). Après ca ne t'empêche pas d'assigner des valeurs sur deux dimensions dans ton pointeurs.
          1. re salut !
            Franchement au lieu d'essayer de débbugguer du code, dont on sait même pas ce a quoi il devait servir (et qui marche pas), dis nous plutot directement ce que tu voulais faire exactement ?

            @++
            1. Non mais c bon , merci de vos reponses.
              EN fait pr moi comme la memoire est lineaire , malloquer un tableau de 4*5 ou autre , ca revenait tjrs a malloquer 20 cases , donc je me disais que malloc de 20 ca devait marcher.

              Bref ca marche maintenant , merci