J'ai une fonction simple qui écrit des données dans un nouveau fichier. Cela fonctionne et le fichier est écrit, mais j'obtiens l'erreur mentionnée ci-dessus lors du débogage dans MSVS Express 2013.
void writeSpecToFile(const char *fname); //in header file.
char myChar [20];
sprintf(myChar, "aa%03daa%daa", i1, i2);
const char* new_char = myChar;
writeSpecToFile(myChar);
Comme vu, j'insère simplement quelques variables dans une chaîne en utilisant sprintf (fonctionne très bien). Maintenant, que je passe myChar ou new_char, cela me donne toujours l'erreur de corruption.
Qu'est ce qui ne s'est pas bien passé?
Pourquoi avez-vous déclaré que votre tampon de caractères avait une taille de 20? Il est plus que probable que sprintf
a placé plus de caractères que cela ne peut tenir dans myChar.
Utilisez plutôt
Si vous suivez la route "devinez la plus grande taille pour mon tableau", la dernière chose que vous voulez faire est d'essayer de compter, jusqu'au dernier caractère, la taille du tampon. Si vous êtes décalé d'un seul octet, cela peut provoquer un plantage.
En supposant int
32 bits, en imprimer un avec %d
produira un maximum de 8 caractères visibles.
Votre chaîne de format contient également 6 caractères a
- littéraux, et nous ne devons pas oublier la terminaison 0.
En tout: 2*8+6+1 = 23 > 20
!!
Votre mémoire tampon doit être d'au moins 23 octets, sauf s'il existe d'autres restrictions d'entrée non divulguées.
Personnellement, je lui donnerais un round 32.
Aussi, mieux utiliser snprintf
et éventuellement vérifier que la chaîne complète correspondait réellement (si elle ne correspond pas, vous obtenez une chaîne raccourcie, donc pas de catastrophe).
char myChar [32];
snprintf(myChar, sizeof myChar, "aa%03daa%daa", i1, i2);
Attention, l'implémentation Microsoft n'est pas conforme et ne garantit pas la terminaison 0.