Ton code d'exemple me chiffonne un peu: Pourquoi faire un malloc() puis un realloc() ?
Ça peut être fait avec 2 appels à snprintf() et un seul malloc(). En effet, si tu spécifie une taille de buffer de 0 au 1er snprintf(), logiquement, il ne devrait pas chercher à remplir le buffer passé en argument. Par contre tu devrais quand même récupérer la taille finale de la chaine. Ça me semble plus court, plus lisible, et plus optimisé.
Au final, ça donne un truc dans ce genre là:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
static const char *format = "ceci est un test, %d";
static const int value = 42;
int str_length;
char *buffer;
str_length = snprintf(NULL, 0, format, value);
str_length++; /* '0円' */
buffer = malloc(str_length);
if (buffer == NULL)
{
fprintf(stderr, "Out of memory\n");
return EXIT_FAILURE;
}
snprintf(buffer, str_length, format, value);
printf("Out: %s\n", buffer);
free(buffer);
return EXIT_SUCCESS;
}
# Pourquoi malloc() puis realloc() ?
Posté par Jérôme Flesch (site web personnel) . En réponse au journal Genèse d'un journal. Évalué à 3. Dernière modification le 09 septembre 2012 à 13:10.
Ton code d'exemple me chiffonne un peu: Pourquoi faire un malloc() puis un realloc() ?
Ça peut être fait avec 2 appels à snprintf() et un seul malloc(). En effet, si tu spécifie une taille de buffer de 0 au 1er snprintf(), logiquement, il ne devrait pas chercher à remplir le buffer passé en argument. Par contre tu devrais quand même récupérer la taille finale de la chaine. Ça me semble plus court, plus lisible, et plus optimisé.
Au final, ça donne un truc dans ce genre là: