Dans mes programmes C, j'ai souvent besoin d'un moyen de faire une représentation sous forme de chaîne de mes ADT. Même si je n'ai pas besoin d'imprimer la chaîne à l'écran de quelque manière que ce soit, il est intéressant d'avoir une telle méthode de débogage. Donc, ce genre de fonction revient souvent.
char * mytype_to_string( const mytype_t *t );
En fait, je me rends compte que j'ai (au moins) trois options ici pour gérer la mémoire pour la chaîne à retourner.
Alternative 1: Stockage de la chaîne de retour dans un tableau de caractères statiques dans la fonction. Je n'ai pas besoin de beaucoup de réflexion, sauf que la chaîne est écrasée à chaque appel. Ce qui peut être un problème à certaines occasions.
Alternative 2: allouez la chaîne sur le tas avec malloc à l'intérieur de la fonction. Vraiment bien puisque je n'aurai alors pas besoin de penser à la taille d'un tampon ou à l'écrasement. Cependant, je dois me rappeler de libérer () la chaîne une fois terminé, puis je dois également attribuer à une variable temporaire que je peux libérer. et puis l'allocation de tas est vraiment beaucoup plus lente que l'allocation de pile, donc soyez un goulot d'étranglement si cela se répète dans une boucle.
Alternative 3: passez le pointeur vers un tampon et laissez l'appelant allouer ce tampon. Comme:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Cela apporte plus d'efforts à l'appelant. Je remarque également que cette alternative me donne une autre option sur l'ordre des arguments. Quel argument dois-je avoir en premier et en dernier? (en fait six possibilités)
Alors, que dois-je préférer? Pourquoi? Existe-t-il une sorte de standard non écrit parmi les développeurs C?
sysctlbyname
sous OS X et iOS