Pergunta

Eu tenho um problema com o seguinte código:

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

Ele compila bem, mas quando eu executá-lo ele me dar o erro infame "Violação 0xc0000005 acesso". Tenho experimentado definindo b para NULL, "", "0", 0 e um monte de outras coisas, mas então eu obter o "erro" ou "Violação 0xc0000005 Acesso Expression: string = NULL Qualquer ajuda seria apreciada.

Foi útil?

Solução

sprintf grava os dados em um buffer existente, que você passar para ele como o primeiro parâmetro. Atualmente você não está especificando um valor para b em tudo, o que significa (IIRC em C) o valor pode ser qualquer coisa. Se você configurá-lo para NULL ou 0, sprintf vai tentar escrever na memória começando no endereço 0.

Você precisa criar um buffer de tamanho apropriado, de modo que sprintf pode escrever para ele. Por exemplo:

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

Se isso é realmente como você deseja alocar o buffer depende do que o seu código real, quer fazer com os resultados, é claro.

Outras dicas

Umm ... O ponteiro para b contém lixo desde que você não inicializada ou alocada espaço. Springtf requer que você tenha atribuído um espaço de buffer de destino ...

No mínimo, você quer algo como carvão b [50] ou o tamanho máximo que você espera, não apenas um char *.

char * é um ponteiro não inicializado para uma matriz de char ou carvão animal. É necessário definir um char tampão [10], de outro modo o endereço de destino de sprintf é indefinido.

sprintf obriga a passá-lo tamponar um caractere já alocados grande o suficiente para armazenar qualquer resultado possível. Isto é altamente sujeita a buffer overflows - você provavelmente vai querer usar o snprintf mais seguro em seu lugar. Uma maneira ineficiente, mas seguro para fazer isso:

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

Muito obrigado! Desde que eu precisava de um char * Eu reescrevi o código para:

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

e funciona como um encanto. Finalmente posso agora continuar com a minha vida! Mais uma vez muito obrigado muito!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top