Sono interessato a leggere un byte di memoria in C.Im utilizzando netbeans su ubuntu e sotto è il mio codice per leggere solo un byte (non l’intero valore di a). ma nulla viene stampato sullo schermo.
main() { int a[1]={3}; //printf(%d",a[0]); //line 2 printf("\x07",a[0]); //line 3 }
nella mia idea, la memoria in indirizzo con etichetta a è composta da:
L’istruzione printf () nella riga 2 indica che andare all’indirizzo 0x ??? 4 e:
L’istruzione printf () nella riga 3 usa \ (e non%) e bit da 0 a 7 (1 byte). quindi indica che, vai all’indirizzo 0x0004 e:
quindi il codice dovrebbe stampare quale sia il primo byte in 0x0004 che è 03. ma non lo è. qualche indizio?
Grazie in anticipo
Per favore, non correggere solo la mia syntax. Pensi che le mie ipotesi siano corrette riguardo i formattatori di printf?
Usa un puntatore per indirizzare i singoli byte di ae cambia il tuo printf per usare lo specificatore di formato %x
, ad esempio:
int main(void) { int a = 3; unsigned char *p = (unsigned char *)&a; int i; printf("a ="); for (i = 0; i < sizeof(a); ++i) { printf(" %02x", p[i]); } printf("\n"); return 0; }
Su una macchina little endian con 32 bit int questo dovrebbe produrre il seguente output:
a = 03 00 00 00
main() { int a = 3; // you can use any type you need. size_t size = sizeof(a); char *phead = malloc(size); memcpy(phead,&a,size); size_t i; char *p = phead; for(i = 0; i < size; i++) printf("%02x ",*p++); free( phead); }
printf ha un formatter esadecimale. È “% x” …
$ man 3 printf
Come sopra, ma uno che funzionerà con interi a 64 bit.
#include #include int main(void) { int64_t i, asz, a = 3; unsigned char *p = (unsigned char *)&a; printf("a = 0x"); for (i = 0, asz = sizeof(a); i < asz; ++i) { printf("%02x ", p[i]); } printf("\n"); return 0; }