Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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?


Yep, I came back :P
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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).


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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?


Yep, I came back :P
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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


Yep, I came back :P
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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?  


Yep, I came back :P
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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 :-)


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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.


Yep, I came back :P
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo