Pergunta

Ter alguns problemas com C. Eu tenho este é o meu código:

// First line works, second line does not! 
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

Estou passando este outbuf para um método chamado PK11_CipherOp(), declarado na biblioteca NSS. A documentação para este método pode ser encontrada aqui, você pode ver que espera um char * Para o param do outbuf.

Não consigo entender por que a primeira linha funciona de maneira confiável e a segunda linha não!

Para ver o código completo, veja Fonte de arquivo

Obrigado,

Hamilton

Foi útil?

Solução

Seu problema parece ser uma declaração ausente para malloc - Você não incluiu <stdlib.h>.

Isso significa que seu compilador está assumindo que a função retorna int, que está sendo explicitamente lançado para (unsigned char *). Se você estiver em uma plataforma onde sizeof(int) != sizeof(void *), como x86-64, então isso vai gerenciar o valor do ponteiro.

Isso ilustra perfeitamente por que em C (ao contrário de C ++) você deveria não lançar o resultado de malloc() - Fazer isso é desnecessário e esconde esse bug exato de você. Também ilustra por que você deve ativar os avisos do compilador.

A correção é #include <stdlib.h>, e remover o elenco de malloc() enquanto você está lá.

Termo aditivo:

Sua outra questão é que você está passando sizeof(outbuf) para PK11_CipherOp(). Isso estará correto (igual a out_buf_size) quando outbuf é uma matriz, mas está incorreto (o tamanho do ponteiro em si) quando outbuf é um ponteiro.

Substitua cada um sizeof(outbuf) com out_buf_size E você deve estar pronto para ir (há outro depois) ...

Outras dicas

Encontrou o problema. Acontece que eu estava usando sizeof(outbuf) como um dos parâmetros. Quando o outbuf é declarado na pilha, como char outbuf[1024]; Isso retorna 1024. no entanto, quando o outbuf está na pilha, como char * outbuf = malloc(1024); O tamanho do USBUF é apenas 4. Esse parâmetro disse à função quanto espaço estava disponível no USBUF, então a função pensou que tinha apenas 4 bytes de sala. Precisa de 16 para fazer nada Por isso, apenas retornou sem realizar nenhum trabalho.

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