PDA

Visualizza la versione completa : [C++] Visualizzazione del contenuto di una locazione di memoria


Bellerofonte90
07-08-2007, 11:57
#include <iostream.h>

int main()
{
unsigned int *scope=(unsigned int *)0x0090DC36;
cout<<*scope;
return 0;
}


Non mi dà alcun errore nel debug, me lo dà in runtime ("expression cannot be evaluated" nella linea del cout).

Il programma in poche parole deve VISUALIZZARE ciò che contiene l'indirizzo di memoria 0x0090DC36 in questo caso, o comunque un indirizzo di memoria qualsiasi. Dove potrebbe essere l'errore?

andbin
07-08-2007, 12:14
Originariamente inviato da Bellerofonte90


#include <iostream.h>

int main()
{
unsigned int *scope=(unsigned int *)0x0090DC36;
cout<<*scope;
return 0;
}


Non mi dà alcun errore nel debug, me lo dà in runtime ("expression cannot be evaluated" nella linea del cout).

Il programma in poche parole deve VISUALIZZARE ciò che contiene l'indirizzo di memoria 0x0090DC36 in questo caso, o comunque un indirizzo di memoria qualsiasi. Dove potrebbe essere l'errore? Il sorgente di per sé è corretto. Sarebbe meglio usare <iostream> e fare using namespace std; invece di usare <iostream.h> ma il succo non cambierebbe.

La questione è un'altra: ti è chiaro che non puoi andare a leggere/usare una qualunque locazione di memoria a caso e a tuo piacimento?

Bellerofonte90
07-08-2007, 12:31
è da poco che studio il c++, siccome ho saputo che anche se è un linguaggio ad alto livello comunque potevo in qualche modo manipolare gli indirizzi di memoria volevo vedere se riuscivo a visualizzare quello che conteneva un dato indirizzo di memoria.

andbin
07-08-2007, 12:43
Originariamente inviato da Bellerofonte90
è da poco che studio il c++, siccome ho saputo che anche se è un linguaggio ad alto livello comunque potevo in qualche modo manipolare gli indirizzi di memoria volevo vedere se riuscivo a visualizzare quello che conteneva un dato indirizzo di memoria. Sì ma la questione è un'altra: ogni processo ha il suo spazio di indirizzamento e il "layout" della memoria dipende fortemente dal sistema operativo. Cioè è il SO che stabilisce dove mettere codice, dati, stack e quant'altro.
A meno che tu abbia precise nozioni sulla architettura del sistema, è inutile andare a sparare locazioni di memoria a caso.

Alloca della memoria con new o malloc() e usala come vuoi.

Bellerofonte90
07-08-2007, 12:52
Utilizzo Windows Vista 6.0.6000

non ho capito l'ultima tua riga

"Alloca della memoria con new o malloc() e usala come vuoi."

andbin
07-08-2007, 13:18
Originariamente inviato da Bellerofonte90
non ho capito l'ultima tua riga

"Alloca della memoria con new o malloc() e usala come vuoi." Generalmente non è il programmatore che stabilisce gli indirizzi di memoria a cui accedere!
Salvo eccezioni, in cui la piattaforma hw/sw stabilisce che "esistono" delle locazioni o blocchi di memoria ben precisi e a determinati indirizzi.

Ad esempio nel vecchio MS-DOS si sapeva che all'indirizzo B800:0000 c'era l'area di memoria relativa al buffer video in modalità testuale.
Pertanto si poteva fare una cosa del tipo:

char far *schermo = (char far *) 0xB8000000;

e andarci a leggere/scrivere sopra.

Nei moderni sistemi a 32 bit, Windows, Linux, ecc... c'è un maggior distacco dall'hardware e non ci sono almeno a livello utente indirizzi "precisi".

Il programmatore C/C++ tipico si limita ad usare gli indirizzi forniti dagli operatori del linguaggio o forniti da una qualche funzione di libreria/del sistema operativo.

Quindi si può fare:


int main (void)
{
int var;
int *p = &var; /* prendo l'indirizzo di var */

.....
}
Spero che adesso sia un po' più chiaro. ;)

Loading