Quand sscanf()
obtient deux "% ms" dans la chaîne de format. Est-il prudent d'appeler free () pour les deux pointeurs cibles, lorsque le sscanf()
renvoie 0 ou 1? Comme dans la fonction suivante:
void foo(const char* text)
{
char* key = NULL;
char* value = NULL;
int count = sscanf(text, "%ms %ms", &key, &value);
if (count == 2)
{
...
}
free(key);
free(value);
}
Ou peut le pointeur cible plus tard (value
) ont une valeur de déchets? Et le nettoyage suivant est nécessaire:
void bar(const char* text)
{
char* key = NULL;
char* value = NULL;
int count = sscanf(text, "%ms %ms", &key, &value);
if (count == 2)
{
...
free(key);
free(value);
}
else if (count == 1)
{
free(key);
}
}
Réponses:
4 pour la réponse № 1Tout d'abord, vous devez être conscient que m
dans une spécification de conversion est non standard, vous devriez donc penser à l'utiliser deux fois: votre code ne sera pas portable.
Mais alors, si votre implémentation prend en charge m
, cet usage est sûr aussi longtemps que vous initialisez vos pointeurs sur 0
/NULL
. scanf()
ne touche jamais à rien quand il n'y a pas de conversion possible et free(0)
est spécifié pour être un pas d'op (c'est toujours sûr).