Pregunta

Tener algunos problemas con C. He este es mi código:

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

Estoy pasando esta outbuf a un método llamado PK11_CipherOp(), declaró en la biblioteca NSS. La documentación de este método se puede encontrar aquí , se puede ver que espera un parámetro para el char * outbuf.

No puedo entender por qué la primera línea funciona de forma fiable, y la segunda línea no!

Para ver el código completo puede consultarse en archivo Fuente

Gracias,

Hamilton

¿Fue útil?

Solución

Su problema parece ser una declaración que falta para malloc -. No se ha incluido <stdlib.h>

Esto significa que el compilador está asumiendo la función devuelve int, que a su vez está siendo convierta explícitamente a (unsigned char *). Si se encuentra en una plataforma donde sizeof(int) != sizeof(void *), como x86-64, entonces esto va mangle el valor del puntero.

Esto ilustra perfectamente por qué en C (a diferencia de C ++) que debe no emitir el resultado de malloc() - de este modo no es necesario, y se esconde este error exacta de usted. También ilustra por las que debe encender las advertencias del compilador.

La solución es #include <stdlib.h>, y retirar el molde de malloc() mientras estás allí.

Adición:

Su otra cuestión es que estás pasando sizeof(outbuf) a PK11_CipherOp(). Este será correcto (igual a out_buf_size) cuando outbuf es una matriz, pero es incorrecta (el tamaño de la propio puntero ) cuando outbuf es un puntero.

Reemplazar cada sizeof(outbuf) con out_buf_size y usted debe ser bueno para ir (hay otro más adelante también) ...

Otros consejos

encontró el problema. Resulta que yo estaba usando sizeof(outbuf) como uno de los parámetros. Cuando el outbuf se declara en la pila, como char outbuf[1024]; esto devuelve 1024. Sin embargo, cuando es outbuf en el montón, como el tamaño de char * outbuf = malloc(1024); outbuf es sólo 4. Este parámetro le dijo a la función de cómo estaba disponible en el outbuf mucho espacio, por lo que la función pensado que sólo tenía 4 bytes de espacio. Se necesita hacer 16 lo por lo que acaba de regresar sin realizar ningún trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top