2013-03-08 12 views
14

Ciao a tutti, voglio eseguire un debug con printf. Ma non so come stampare la variabile "out".Stampa di una variabile void * in C

Prima del reso, voglio stampare questo valore, ma il suo tipo è nullo *.

int 
hexstr2raw(char *in, void *out) { 
    char c; 
    uint32_t i = 0; 
    uint8_t *b = (uint8_t*) out; 
    while ((c = in[i]) != '\0') { 
     uint8_t v; 
     if (c >= '0' && c <= '9') { 
      v = c - '0'; 
     } else if (c >= 'A' && c <= 'F') { 
      v = 10 + c - 'A'; 
     } else if (c >= 'a' || c <= 'f') { 
      v = 10 + c - 'a'; 
     } else { 
      return -1; 
     } 
     if (i%2 == 0) { 
      b[i/2] = (v << 4); 
      printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);} 
     else { 
      b[i/2] |= v; 
      printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);} 
     i++; 
    } 
    printf("%s\n", out); 
    return i; 
} 

Come posso fare? Grazie.

+1

Che tipo di dati ti aspetti che "out" puntare? – Nick

+1

Vuoi davvero stampare il valore del puntatore stesso? Considerando cosa fa il codice, sembra più probabile che tu voglia stampare il risultato, cioè i byte generati. Vedi la mia risposta su come farlo. :) – unwind

risposta

12

questo:

uint8_t *b = (uint8_t*) out; 

implica che out è in realtà un puntatore a uint8_t, quindi forse si desidera stampare i dati che in realtà è lì. Si noti inoltre che non è necessario eseguire il cast da void * in C, quindi il cast è davvero inutile.

Il codice sembra eseguire la conversione da esadecimale a binario, archiviando i risultati a out. È possibile stampare la i byte generati da fare:

int j; 
for(j = 0; j < i; ++j) 
    printf("%02x\n", ((uint8_t*) out)[j]); 

Il valore puntatore sé è raramente interessante, ma è possibile stampare con printf("%p\n", out);. Lo specificatore di formattazione %p è per void *.

+2

'uint8 *' non dovrebbe essere 'uint8_t' nella tua linea' printf'? – MrPickles

36
printf("%p\n", out); 

è il modo corretto di stampare un puntatore (void*).

+2

Se si desidera stampare il valore anziché il puntatore, vedere la risposta di svolgimento. –

+0

Ho memorizzato una sequenza di caratteri costante in un vuoto * e usando% p% non sta stampando la stringa ma quello che sembra essere l'indirizzo della stringa – Mushy

6

L'identificatore di formato per la stampa di puntatori void utilizzando printf in C è %p. Ciò che solitamente viene stampato è una rappresentazione esadecimale del puntatore (sebbene lo standard indichi semplicemente che si tratta di una sequenza di caratteri definita dall'implementazione che definisce un puntatore).

+0

Tecnicamente, è compito dell'implementazione scegliere il "cosa viene stampato", ma Non ho mai visto nulla di diverso da un numero esadecimale semplice (nonostante le voci su AS/400). :-) – torek

+0

@torek Hai ragione, lo standard dice che è stata definita l'implementazione. Tutte le implementazioni che ho visto finora hanno deciso di usare hex, però :) – dasblinkenlight

+0

@dasblinkenlight Ciao, sono un po 'in ritardo qui, ma speravo di chiederti: ho visto da qualche parte che printf ("% p \ n", PTR); dovrebbe essere printf ("% p \ n", (void *) ptr); oppure avremmo un comportamento indefinito, è vero? Se è così, perché? Grazie in anticipo. – Unheilig