web-dev-qa-db-fra.com

pile autour de la variable ... était corrompue

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é?

14
student1

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

  1. constructions plus sûres telles que std :: ostringstream ou
  2. à tout le moins, déclarez que vos tableaux de caractères sont beaucoup plus grands que ce à quoi vous vous attendez (pas la meilleure façon, mais au moins, l'erreur ne se serait pas produite).

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.

14
PaulMcKenzie

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.

9
Deduplicator