Domanda

Ho un problema con il seguente codice:

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

Si compila bene ma quando lo eseguo mi dà il famigerato "0XC0000005 violazione di accesso" errore. Ho provato a impostare b su NULL, " " ;, " 0 " ;, 0 e un sacco di altre cose, ma poi ottengo la violazione di accesso " 0XC0000005 " errore o " Espressione: stringa! = NULL. Qualsiasi aiuto sarebbe apprezzato!

È stato utile?

Soluzione

sprintf scrive i dati in un buffer esistente, che viene passato al suo interno come primo parametro. Attualmente non stai specificando affatto un valore per b, il che significa che (IIRC in C) il valore potrebbe essere qualsiasi cosa. Se lo si imposta su NULL o 0, sprintf proverà a scrivere in memoria a partire dall'indirizzo 0.

Devi creare un buffer della dimensione appropriata, in modo che sprintf possa scriverlo. Ad esempio:

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

Il fatto che sia effettivamente il modo in cui si desidera allocare il buffer dipende, ovviamente, da ciò che il proprio codice reale vuole fare con i risultati.

Altri suggerimenti

Umm ... Il puntatore a b contiene immondizia poiché non è stato inizializzato o non è stato allocato spazio. Springtf richiede di aver allocato uno spazio buffer di destinazione ...

Come minimo, vuoi qualcosa come char b [50] o qualunque dimensione massima ti aspetti, non solo un char *.

Un carattere * è un puntatore non inizializzato a un array di caratteri o di caratteri. È necessario definire un buffer char [10], altrimenti l'indirizzo di destinazione di sprintf non è definito.

sprintf richiede di passargli un buffer di caratteri già allocato abbastanza grande da memorizzare ogni possibile risultato. Questo è altamente soggetto a buffer overflow - probabilmente si desidera utilizzare snprintf più sicuro. Un modo inefficiente ma sicuro per farlo:

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

Grazie mille! Dato che avevo bisogno di un carattere * ho riscritto il codice in:

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

e funziona come un fascino. Ora posso finalmente andare avanti con la mia vita! Ancora una volta grazie mille!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top