Bonjour,

Toujours dans ma quête d’apprentissage du C, je veux remplir de caractères un tableaux a 2 dimensions. J'ai un fichier et pour chaque ligne du fichier je stocke la chaîne de caractère dans une case du tableau.

Mon problème est le suivant : j'ai un "Segmentation Fault" sur la dernière ligne du tableau, quand j'ai 25 lignes à copier, j'en copie 24 et la dernière provoque une jolie "Segmentation Fault". Quand j'ai 4 lignes, j'en copie 3 et la dernière provoque une jolie "Segmentation Fault", etc.

Un exemple sera peut-être plus parlant :
- le fichier que je veux copier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
4
yuay
jkja
oiyi
aoiu
- le résultat d’exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
/>./BSQ exemple
yuay
jkja
oiyi
Erreur de segmentation
Et voici le code :

- le main :
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
int     main(int argc, char **argv)
{
  int   fd;
  int   ret;
  char  *buffer;
 
  buffer = malloc(sizeof(char));
  fd = open(argv[1], O_RDONLY);
  if (fd == -1)
    {
      my_putstr("open error");
      return (1);
    }
  ret = read(fd, buffer, buffer);
  pos_origin(buffer);
  close(fd);
  return (0);
}
- fonction de remplissage :
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
int     count_line(char *str)
{
  int   i;
  int   nbr_line;
 
  i = 0;
  nbr_line = 0;
  while (str[i])
    {
      if (str[i] == '\n')
        nbr_line = nbr_line + 1;
      i = i + 1;
    }
  return (nbr_line);
}
 
int     pos_origin(char *buffer)
{
  int   i;
  int   n;
  int   v;
  int   y;
  int   nbr_line;
  char  **tab;
 
  y = 2;
  i = 0;
  n = 0;
  v = 0;
  nbr_line = count_line(buffer);
  tab = malloc(sizeof(char *));
  while (n < nbr_line)
    {
      tab[n] = malloc(sizeof(char));
      n = n + 1;
    }
  while (y != '\0')
    {
      while (buffer[y] != '\n')
        {
          tab[v][i] = buffer[y];
          y = y + 1;
          i = i + 1;
        }
      my_printf("%s\n", tab[v]);
      v = v + 1;
      y = y + 1;
      i = 0;
    }
  free(tab);
  free(*tab);
}
Merci d'avance à ceux qui prendront le temps de me lire et de m'aider.