Domanda

Avendo alcuni problemi con C. Ho questo è il mio codice:

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

sto passando questo outbuf ad un metodo chiamato PK11_CipherOp(), dichiarata nella libreria NSS. La documentazione per questo metodo può essere trovato qui , si può vedere che si aspetta un char * per il parametro outbuf.

Non riesco a capire il motivo per cui la prima linea funziona in modo affidabile, e la seconda linea non lo fa!

Per vedere il codice completo, vedere Origine file

Grazie,

Hamilton

È stato utile?

Soluzione

Il problema sembra essere una dichiarazione mancante per malloc -. Non hai incluso <stdlib.h>

Ciò significa che il compilatore sta assumendo la funzione restituisce int, che viene poi viene esplicitamente cast (unsigned char *). Se siete su una piattaforma in cui sizeof(int) != sizeof(void *), come x86-64, allora questo storpiare il valore del puntatore.

Questo illustra perfettamente il motivo per cui in C (a differenza di C ++) si dovrebbe non il cast del risultato di malloc() - così facendo è inutile, e si nasconde questo esatto bug da te. Esso illustra anche il motivo per cui si dovrebbe attivare gli avvisi del compilatore.

La correzione è per #include <stdlib.h>, e rimuovere il cast da malloc() mentre sei lì.

Addendum:

Il tuo altra questione è che si sta passando a sizeof(outbuf) PK11_CipherOp(). Questo sarà corretta (pari a out_buf_size) quando outbuf è un array, ma non è corretto (la dimensione del puntatore stesso ) quando outbuf è un puntatore.

sostituire ogni sizeof(outbuf) con out_buf_size e si dovrebbe essere pronti per partire (ce n'è un altro in seguito troppo) ...

Altri suggerimenti

Trovato il problema. Risulta che stavo usando sizeof(outbuf) come uno dei parametri. Quando l'outbuf viene dichiarato in pila, come char outbuf[1024]; restituisce 1024. Tuttavia, quando outbuf è sul mucchio, come char * outbuf = malloc(1024); la dimensione del outbuf è solo 4. Questo parametro ha detto alla funzione di quanto spazio era disponibile nella outbuf, in modo che il funzione pensato che aveva solo 4 byte di spazio. Ha bisogno di fare 16 niente in modo che appena tornato senza eseguire alcun lavoro.

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