Erreur de segmentation Sprintf

numCheck est un nombre compris entre 1 et 1000. Ce code me donne une erreur de segmentation uniquement lorsque je collecte les résultats de sprintf dans charcheck. Si j’utilise simplement sprintf sans utiliser les résultats, je ne reçois pas de faute distincte. Qu’est-ce qu’il se passe ici?

char * numSsortingng; int charcheck = sprintf(numSsortingng, "%d", numCheck); 

Vous devez fournir votre propre mémoire pour sprintf . De plus, n’utilisez pas sprintf , mais plutôt snprintf :

 char buf[1000] = {0}; snprintf(buf, 999, ....); 

Sinon, vous pouvez allouer de la mémoire dynamicment:

 char * buf = new char[BUFSIZE]; snprintf(buf, BUFSIZE-1, ...); /* ... */ delete[] buf; 

Le premier argument de sprintf doit pointer vers un tampon valide. Vous avez un personnage char* mais il pointe à la poubelle.

Changez votre code pour:

 char numSsortingng[80] = { }; int charcheck = sprintf(numSsortingng, "%d", numCheck); 

Ainsi, numSsortingng pointe en fait sur un tampon valide (80 caractères dans cet exemple, dont tous les éléments sont initialisés à 0).

Il serait également bon d’utiliser snprintf pour pouvoir lui transmettre la taille de votre tampon, ce qui aidera à prévenir les débordements de tampon:

 const int bufsize = 80; char numSsortingng[bufsize] = { }; int charcheck = snprintf(numSsortingng, bufsize - 1, "%d", numCheck); 

Notez que vous soustrayez un de la taille de la mémoire tampon que vous transmettez à snprintf car vous ne voulez pas qu’il utilise le dernier emplacement, vous devez vous assurer que la NULL correspond à la fin de la chaîne.

Le pointeur indiqué en tant que premier paramètre de sprintf doit pointer vers un emplacement de mémoire où sprintf doit écrire la chaîne mise en forme.

Dans ce cas, vous n’avez pas initialisé numSsortingng pour pointer sur la mémoire allouée pour la chaîne mise en forme. Puisque numSsortingng n’est pas initialisé, il peut pointer n’importe où, et dans votre cas, essayer d’écrire la sortie formatée à cet emplacement entraîne une erreur de segmentation.

Vous devez allouer de l’espace au résultat, tel que

 char numSsortingng[50]; int charcheck = sprintf(numSsortingng, "%d", numCheck); 

Dans votre cas, les rouages ​​internes de sprintf tentent de référencer NULL, qui est la valeur par défaut pour un pointeur dans votre cas.

La chose la plus simple à faire est d’utiliser un tableau comme ci-dessus, par exemple,

 char numSsortingng[80] = { }; 

suggéré par Seth, Jésus et Kerrek.

Je pense que la dernière réponse de sth est une bonne explication: “le premier paramètre de sprintf devrait pointer sur un emplacement mémoire où sprintf devrait écrire la chaîne formatée.” Donc, en plus d’utiliser un tableau de caractères, ce qui forcerait l’allocation de mémoire pour la chaîne, vous pouvez également utiliser ceci:

 char *numssortingng = (char*) malloc(80); 

Cela devrait vous permettre de libérer explicitement la mémoire allouée lorsque vous n’en avez plus besoin.