Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Bytes all'interno di un indirizzo di memoria
Forum - C/C++ - Bytes all'interno di un indirizzo di memoria

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 22:18
Sabato, 30/10/2010
Avendo un indirizzo di memoria per esempio
Codice sorgente - presumibilmente C/C++

  1. int *p = (unsinged int *) 0x00F;


È possibile vedere che byte ci sono, in quell'indirizzo, nel formato esadecimale?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:20
Sabato, 30/10/2010
Testo quotato

Postato originariamente da Pitagora:

Avendo un indirizzo di memoria per esempio
Codice sorgente - presumibilmente C/C++

  1. int *p = (unsinged int *) 0x00F;


È possibile vedere che byte ci sono, in quell'indirizzo, nel formato esadecimale?  



certo... però vedi solo i byte dell'address space del tuo processo. Non puoi leggere i byte di indirizzi di memoria appartenenti allo spazio di un altro processo (almeno non in modo semplice).

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 22:24
Sabato, 30/10/2010
come è possibile vederli. Mi fai un esempio?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:55
Sabato, 30/10/2010
Codice sorgente - presumibilmente C++

  1. /* visualizziamo 3 byte a caso */
  2. unsigned char a,b,c;
  3. char *p = (unsigned char *)0xBADC0DE;
  4.  
  5. a = p[0];
  6. b = p[1];
  7. c = p[2];
  8.  
  9. printf("a = %x\n", a);
  10. printf("b = %x\n", b);
  11. printf("c = %x\n", c);


Ultima modifica effettuata da TheKaneB il 30/10/2010 alle 22:56
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 10:18
Domenica, 31/10/2010
Compilando ho un:
Codice sorgente - presumibilmente Plain Text

  1. Segmentation fault


Perchè non mi fa accedere a quell'indirizzo di memoria perchè è preso a "cavolo"?

Ultima modifica effettuata da Pitagora il 31/10/2010 alle 14:21
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:21
Domenica, 31/10/2010
Testo quotato

Postato originariamente da Pitagora:

Compilando ho un:
Codice sorgente - presumibilmente Plain Text

  1. Segmentation fault


Perchè non mi fa accedere a quell'indirizzo di memoria? Quanti bytes ci sono in un indirizzo di memoria?



è quantomeno "ovvio" che non ti faccia accedere! Il tuo processo non possiede i diritti per accedere a qualsiasi indirizzo preso a caso... devi allocare dello spazio con malloc e poi accedervi con quel codice.

L'indirizzo messo brutalmente nel codice va benissimo quando programmi dentro il kernel, oppure se programmi su una piattaforma con un OS permissivo (o meglio senza nessun OS). Su windows e linux ti attacchi al tram... per fortuna, direi!

PS: ogni indirizzo identifica un singolo byte.

Ultima modifica effettuata da TheKaneB il 31/10/2010 alle 14:21
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 14:35
Domenica, 31/10/2010
mmmmm quindi
p[0] corrisponde al byte dell'indirizzo 0xBADC0DE
p[1] corrisponde al byte dell'indirizzo 0XBADCODE1
p[2] corrisponde al byte dell'indirizzo 0xBADC0DE2

giusto?  

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:38
Domenica, 31/10/2010
Testo quotato

Postato originariamente da Pitagora:

mmmmm quindi
p[0] corrisponde al byte dell'indirizzo 0xBADC0DE
p[1] corrisponde al byte dell'indirizzo 0XBADCODE1
p[2] corrisponde al byte dell'indirizzo 0xBADC0DE2

giusto?  



esattamente :-)

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:13
Domenica, 31/10/2010
Testo quotato

Postato originariamente da TheKaneB:

Codice sorgente - presumibilmente C++

  1. /* visualizziamo 3 byte a caso */
  2. unsigned char a,b,c;
  3. char *p = (unsigned char *)0xBADC0DE;
  4.  
  5. a = p[0];
  6. b = p[1];
  7. c = p[2];
  8.  
  9. printf("a = %x\n", a);
  10. printf("b = %x\n", b);
  11. printf("c = %x\n", c);



Il commento è inappropriato. È molto meglio così:
Codice sorgente - presumibilmente C++

  1. /* visualizziamo i primi 3 byte a partire dall'indirizzo 0xBADC0DE */
  2. unsigned char a,b,c;
  3. char *p = (unsigned char *)0xBADC0DE;
  4.  
  5. a = p[0];
  6. b = p[1];
  7. c = p[2];
  8.  
  9. printf("a = %x\n", a);
  10. printf("b = %x\n", b);
  11. printf("c = %x\n", c);

Non per niente, ma è quello che mi ha fatto confondere le idee.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo