Question

J'ai un problème avec le code suivant:

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

Il compile bien, mais lorsque je l'exécute, il me donne l'infâme "Violation d'accès 0XC0000005". Erreur. J'ai essayé de définir b sur NULL, "", "0", 0 et bien d'autres choses, mais le message "0XC0000005 Access Violation" s'affiche. erreur ou "Expression: string! = NULL. Toute aide serait la bienvenue!

Était-ce utile?

La solution

sprintf écrit les données dans un tampon existant, que vous lui transmettez en tant que premier paramètre. Actuellement, vous ne spécifiez pas de valeur pour b, ce qui signifie (IIRC en C) que la valeur peut être n'importe quoi. Si vous le définissez sur NULL ou sur 0, sprintf va essayer d'écrire dans la mémoire à partir de l'adresse 0.

Vous devez créer un tampon de la taille appropriée pour que sprintf puisse y écrire. Par exemple:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

Que ce soit réellement , comment vous souhaitez affecter le tampon dépend de ce que votre code réel veut faire des résultats, bien sûr.

Autres conseils

Umm ... Votre pointeur sur b contient des déchets puisque vous ne l'avez pas initialisé ni alloué d'espace. Springtf nécessite que vous ayez alloué un espace tampon de destination ...

Au minimum, vous voulez quelque chose comme char b [50] ou quelle que soit la taille maximale que vous attendez, pas seulement un char *.

Un caractère * est un pointeur non initialisé sur un caractère ou un tableau de caractères. Vous devez définir un caractère de tampon [10], sinon l'adresse cible de sprintf n'est pas définie.

sprintf nécessite de lui transmettre un tampon de caractères déjà alloué suffisamment volumineux pour stocker tout résultat possible. Cela est très sujet aux débordements de mémoire tampon - vous voudrez probablement utiliser plutôt le snprintf plus sûr. Un moyen inefficace mais sûr de le faire:

int bufsize = snprintf(NULL, 0, formatstring, ...);
char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
if (buffer == NULL) out_of_memory_error();
snprintf(buffer, bufsize+1, formatstring, ...);

Merci beaucoup! Comme j'avais besoin d'un personnage *, j'ai réécrit le code dans:

for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}

et ça marche à merveille. Je peux enfin enfin vivre ma vie! Encore une fois merci beaucoup!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top