Je ne comprends pas pourquoi tu veux allouer à nouveau de la mémoire pour faire cela.Tu te compliques la tâche. Une simple boucle, qui tient en une ligne ou deux, fait parfaitement l'affaire. Une chaîne de caractères se termine toujours par un '\0'. Si la zone de mémoire allouée est plus grande, ce n'est pas un problème.
Par exemple, si tu alloues 10 char et que tu y écrives les caractères suivants :
'a','b','c','d','\0','f','g','h','i','j'
alors ta chaîne de caractères sera en réalité :
, ce qui n'empêche pas qu'il y a toujours 10 chars alloués. La condition est simplement que la chaîne de caractères tienne dans cette zone de mémoire, elle ne doit absolument pas déborder sinon il faut redouter le crash.
1) Fais attention à la fonction memcpy. Les deux chaînes ne doivent pas se chevaucher. Ce n'est pas le cas dans ton exemple, mais par exemple si tu supprimais qu'un seul caractère, tu te retrouverais alors avec les deux chaînes qui se chevauchent.
Explications :
La fonction memcpy() copie n octets depuis la zone mémoire src vers la zone mémoire dest.
Les deux zones ne doivent pas se chevaucher. Si c'est le cas, utilisez plutôt memmove(3) .
2) Cette ligne
strcpy(str_valeur, "0123456789ABCDEF");
est susceptible de provoquer un crash. Ce n'est pas 16 mais 17 chars qui sont copiées : 16 char + '\0' final.
La fonction strcpy() copie la chaîne pointée par src
(y compris le caractère `\0' final) dans la chaîne pointée par dest. Les deux chaînes ne doivent pas se chevaucher.
La chaîne dest doit être assez grande pour accueillir la copie.
3) Il faut toujours vérifier le retour de malloc. Si la fonction retourne NULL et que tu accèdes à cette adresse, c'est le crash assuré.
4) Au sujet de realloc :
Si realloc() échoue, le bloc mémoire original reste intact, il n'est ni libéré ni déplacé.
Résultat : il y a fuite de mémoire si tu écrases le pointeur, ce qui est le cas dans ton exemple.
Partager