Je ne commenterai pas les problèmes avec le code qui sont correctement traités dans d'autres réponses.
Appeler realloc
pour chaque acte individuel d'extension de la chaîne n'est pas nécessairement une mauvaise pratique. Il semble comme si elle pourrait mal fonctionner, et pour résoudre ce problème, vous pouvez implémenter un système qui augmente la chaîne par incréments plus importants, moins fréquemment. Cependant, comment savez-vous que realloc
ne fait pas déjà quelque chose de ce genre en interne? Par exemple, vous pourriez penser que vous êtes intelligent en faisant passer une chaîne de 128 octets à 256 octets, puis à 512, plutôt qu'un caractère à la fois. Mais si ceux-ci sont les seules tailles de bloc internes disponibles, alors realloc
ne peut pas aider mais passer par les mêmes tailles. Bon, qu'en est-il de l'économie du nombre brut d'appels realloc
effectués? Mais ceux-ci sont juste remplacés par des invocations de la logique de culture de chaîne plus intelligente. Si les performances de cette boucle de création de chaîne de format sont importantes, il convient de les profiler. Faire une version qui réduit les opérations realloc
et le profil aussi. Comparez-le sur toutes les plates-formes cibles pour lesquelles vous écrivez et sur lesquelles les performances sont importantes.
Si les performances ne sont pas critiques, optimisez pour des propriétés telles que la bonne structure, la maintenabilité et la réutilisation du code. Une fonction qui construit une chaîne de format n'a pas besoin de connaître la gestion de la mémoire de chaîne. Il a besoin d'une interface abstraite pour travailler avec des chaînes dynamiques. Cette interface peut fournir une fonction intéressante pour changer une chaîne en place en ajoutant une copie d'une autre chaîne à sa queue. Les fonctions autres que le producteur de chaîne de format peuvent utiliser ces opérations de chaîne.Le code de gestion de chaîne peut décider, en un seul endroit, s'il appelle realloc
chaque fois que la longueur d'une chaîne change, ou si elle suit la taille de stockage séparément de la longueur, et réduit par conséquent le nombre d'appels realloc
.
Ces instructions semblent incorrectes: 'sizeof (* str)' n'est pas ** la taille de la chaîne allouée jusqu'à présent. – chqrlie
Vous pouvez créer une classe String légère (pour C, une 'struct') qui contient un courant' max_length' (qui devrait initialement être "assez gros pour la plupart des cas"). Cela ajouterait à peu près la même surcharge, car vous devrez toujours vérifier la longueur maximale * avant de l'ajouter. – usr2564301
le motif 'str = realloc (str,' ne permet pas la récupération de mémoire insuffisante –