Frage

Ich habe ein Problem mit dem folgenden Code:

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

Es kompiliert gut, aber wenn ich es laufen sie geben mir die berüchtigten „0xC0000005 Zugriffsverletzung“ Fehler. Ich habe b auf NULL versucht Einstellung, „“, „0“, 0 und ein paar anderen Sachen, aber dann bekomme ich die „0xC0000005 Zugriffsverletzung“ Fehler oder „Expression:.! String = NULL Jede mögliche Hilfe würde geschätzt

War es hilfreich?

Lösung

sprintf schreibt Daten in einen vorhandenen Puffer, die man in sie als ersten Parameter übergeben. Derzeit sind Sie keinen Wert für b Angabe überhaupt, was bedeutet (IIRC in C) der Wert könnte alles sein. Wenn Sie es auf NULL gesetzt oder 0, sprintf wird versuchen, in den Speicher zu schreiben ab Adresse 0.

Sie benötigen einen Puffer der entsprechenden Größe zu schaffen, so dass sprintf in sie schreiben kann. Zum Beispiel:

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

Ob das wirklich , wie Sie den Puffer zuweisen möchten hängt davon ab, was Ihre echten Code will mit den Ergebnissen zu tun, natürlich.

Andere Tipps

Umm ... Ihr Zeiger auf b enthält Müll, da Sie nicht initialisiert haben sie oder Platz zugewiesen. Springtf erfordert, dass Sie einen Zielpuffer Platz zugewiesen haben ...

Auf ein Minimum, wollen Sie so etwas wie char b [50] oder was auch immer die maximale Größe, die Sie erwarten, nicht nur ein char *.

A char * ein nicht initialisierten Zeiger auf einen char oder char-Array. Sie benötigen einen Puffer char [10] zu definieren, sonst wird die Zieladresse sprintf nicht definiert ist.

sprintf erfordert es ein bereits zugewiesenen Zeichenpuffer groß genug, um jeglicher mögliche Ergebnis zu speichern. Dies ist sehr Gegenstand einen Pufferüberlauf - Sie wahrscheinlich die sicherere snprintf stattdessen verwenden möchten. Ein ineffizienter aber sichere Weg, das zu tun:

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, ...);

Vielen Dank! Da ich ein Zeichen benötigen * schrieb ich den Code an:

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

und es funktioniert wie ein Charme. Ich kann endlich kommen jetzt mit meinem Leben auf! Nochmals vielen Dank sehr!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top