Ce code est très mauvais 
1 2 3 4 5 6 7 8 9
| # define MEM_SIZE 2048
char *get_next_line(const int fd)
{
char *str;
static char buffer[MEM_SIZE];
static int i = 0;
int j;
static int k = 0; |
Début de fonction, définition et initialisation de variables
Ligne inutile puisque on peut la supprimer et initialiser j à la définition
str = malloc(MEM_SIZE * sizeof(char));
str est donc un tableau de MEM_SIZE caractères. Mais c'est complétement moche de faire cela
: voir après
1 2
| if (k == 0)
k = read(fd, buffer, MEM_SIZE); |
Le test ne sert à rien puisque k ne sera jamais modifié avant sa définition/ initialisation et ici 
Et en plus il n'a aucune signification: qu'est ce qu'on s'en fiche de la valeur de k puisqu'elle va être écrasée?

Là on lit un fichier qui a été ouvert avec la fonction fopen
Du moins il faut l’espérer 
De plus ce n'est pas la fonction read qui faut utiliser mais fread 
Donc on a lu k caractères du fichier fd et ces k caractères sont mis dans buffer
1 2
| if (i == k)
return (NULL); |
Là: code pourri 
- On teste si on a lu aucun caractère avec la variable i qui n'a rien à faire dans le test
- Fuite mémoire parce que str n'a pas été libéré
1 2 3 4 5 6
| while (i < k && buffer[i] != '\n')
{
str[j] = buffer[i];
i = i + 1;
j = j + 1;
} |
Ici on va recopier une ligne (tous les caractères avant le fameux '\n') dans notre tableau str.
Au passage soit i soit j est inutile et on peut utiliser qu'une seule variable 
Et c'est là que le malloc est mal fait. Parce qu'on va créer un tableau de MEM_SIZE caractères, mais une ligne peut avoir moins de caractères (au plus k).
Le mieux à faire c'est de chercher la taille de cette ligne et ensuite, de faire le malloc et un strncpy 
1 2
| if (buffer[i] == '\n')
i = i + 1; |
Code inutile
Le caractère '\0' pour dire "fin de chaîne de caractères"
On retourne notre tableau qu'il faudra libérer après utilisation
Partager