Vu le coût d'un realloc(), il vaut mieux l'utiliser pour doubler la taille du tableau à chaque appel (pseudo-code non testé) :
size_t capacity = 1;
size_t n = 0;
char **text = malloc (capacity * sizeof(char*));
char *ligne = NULL;
if (text == NULL)
{
return NULL;
}
while (lire_ligne(ligne, file) != NULL)
{
if (n == capacity)
{
char **tmp = NULL;
capacity *= 2;
tmp = realloc(text, capacity * sizeof(char*));
if (tmp == NULL)
{
/* free(text) et tout ce qui précède */
return NULL;
}
text = tmp;
}
text[n] = ligne;
n++;
}
Où la fonction lire_ligne est un wrapper autour de fgets() qui ne tronque pas les lignes (cf. https://linuxfr.org/comments/713347.html#713347 pour un de mes messages à ce sujet).
De plus, comme dans mon pseudo-code, il faut tester le retour de realloc(), pour éviter les fuites de mémoire.
[^] # Re: Réponses
Posté par alf . En réponse au message valeur NULL d'un tableau de pointeur. Évalué à 1.
size_t capacity = 1; size_t n = 0; char **text = malloc (capacity * sizeof(char*)); char *ligne = NULL; if (text == NULL) { return NULL; } while (lire_ligne(ligne, file) != NULL) { if (n == capacity) { char **tmp = NULL; capacity *= 2; tmp = realloc(text, capacity * sizeof(char*)); if (tmp == NULL) { /* free(text) et tout ce qui précède */ return NULL; } text = tmp; } text[n] = ligne; n++; }Où la fonction lire_ligne est un wrapper autour de fgets() qui ne tronque pas les lignes (cf. https://linuxfr.org/comments/713347.html#713347 pour un de mes messages à ce sujet). De plus, comme dans mon pseudo-code, il faut tester le retour de realloc(), pour éviter les fuites de mémoire.