PDA

Visualizza la versione completa : [C/C++]: Associare valore Hex a puntatore


darkblOOd
14-09-2006, 16:35
ciao a tutti, volevo sapere se è possibile associare un indirizzo di memoria in formato esadecimale ad un puntatore.

So che un puntatore deve puntare ad un'area di memoria che contiene un valore dello stesso tipo, ma pensavo se era possibile associare cmq il valore esadecimale di una cella di memoria.

per esempio, supponendo di sapere che nella cella 0x23ff45 c'è un valore intero se si può fare:

int *p = 0x23ff45

oppure, se non si conosce il tipo di dato contenuto ma si conosce la cella di memoria alla quale si vuole fare riferimento:

void *p = 0x23ff45


grazie a tutti, scusate se ho detto cose da folli ma sono alle prima armi col c++ :fagiano:

oregon
14-09-2006, 16:46
Puoi scrivere

int *p = (int *)0x23ff45;

ma il puntatore cosi' formato potrebbe puntare ad una zona di memoria il cui accesso non e' permesso al processo che la sta usando (e quindi potresti avere un errore nel momento in cui vuoi leggere il valore puntato).

Naturalmente se parliamo di architetture che utilizzano memoria virtuale per cui non e' affatto vero che all'indirizzo indicato corrisponde una cella di memoria ne' che tale indirizzo sia assegnato al processo ...

darkblOOd
14-09-2006, 16:54
grazie per la risposta. :)

Parlo di ambiente win32. La memoria dovrebbe essere quello dello stack di esecuzione dei programmi (non mi viene il termine!)

In poche parole ho un progamma A che mette un valore in una cella di memoria 0xNNNNNN e volevo sapere se si poteva avere accesso a quella cella da un altro processo del programma B che dichiara un puntatore a quell'indirizzo.

E se non si conosce il tipo di dato che contiene la cella? Il void non può tornare utile in qualche modo? Avevo pensato ad un cast verso il tipo più grande ma così il valore verrebbe falsato

oregon
14-09-2006, 16:58
Un attimo ... non avevi parlato di "processo A" e "processo B" ...

In Win32 la memoria assegnata ai processi e' virtuale e quindi un indirizzo di un "processo A" non ha nulla a che vedere con lo STESSO indirizzo di un "processo B".
Non potrai quindi accedere a dati presenti in memoria in un processo a partire da un processo differente (almeno non cosi').

Per il resto della domanda, se non conosci il tipo di dato, puoi usare un puntatore a char (o a unsigned char) e leggere byte per byte ... l'uso del void non e' utile per determinare quale tipo di dati c'e' a partire da un indirizzo di memoria.

darkblOOd
14-09-2006, 17:02
infatti ho fatto una prova ed avevo immaginato... :fagiano:

se non ti prende troppo tempo e sopratutto non è un argomento complesso, potresti accennarmi la tecnica che solitamente si usa per puntare a celle di memoria di un processo conosciuto?

In ogni caso ti ringrazio molto :ciauz:

andbin
14-09-2006, 17:02
Originariamente inviato da darkblOOd
So che un puntatore deve puntare ad un'area di memoria che contiene un valore dello stesso tipoNo, attenzione. Un puntatore può contenere teoricamente qualunque indirizzo valido per l'architettura della macchina. Che poi quell'indirizzo sia realmente accessibile o meno, è un altro conto.
Inoltre il tipo del valore puntato indica solo che l'operazione di dereferenziazione andrà ad accedere ad una area di memoria lunga quanto il tipo di dato dichiarato.

Per intenderci:
int a = 1234;

int *pi = &a;
short *ps = (short*) &a;

È perfettamente lecito. In pratica pi e ps puntano alla stessa locazione (al valore intero 'a'). A cosa poi possa servire ... sono cavoli tuoi.


Originariamente inviato da darkblOOd
ma pensavo se era possibile associare cmq il valore esadecimale di una cella di memoria.

per esempio, supponendo di sapere che nella cella 0x23ff45 c'è un valore intero se si può fare:

int *p = 0x23ff45

oppure, se non si conosce il tipo di dato contenuto ma si conosce la cella di memoria alla quale si vuole fare riferimento:

void *p = 0x23ff45Certo che è possibile.
Per essere precisi devi fare:

int *p = (int*) 0x23ff45;

Cioè devi fare anche il cast. Il void* non va bene ... semplicemente perché non potresti dereferenziarlo!

Poi a cosa ti serva e cosa contiene quella cella di memoria indicata in esadecimale, ancora una volta, sono cavoli tuoi.

darkblOOd
14-09-2006, 17:05
Originariamente inviato da andbin
No, attenzione. Un puntatore può contenere teoricamente qualunque indirizzo valido per l'architettura della macchina. Che poi quell'indirizzo sia realmente accessibile o meno, è un altro conto. si, hai ragione... sono stato frettoloso ed impreciso :)




A cosa poi possa servire ... sono cavoli tuoi.
...
Poi a cosa ti serva e cosa contiene quella cella di memoria indicata in esadecimale, ancora una volta, sono cavoli tuoi.

in che senso? :master:

oregon
14-09-2006, 17:07
Originariamente inviato da darkblOOd
infatti ho fatto una prova ed avevo immaginato... :fagiano:

se non ti prende troppo tempo e sopratutto non è un argomento complesso, potresti accennarmi la tecnica che solitamente si usa per puntare a celle di memoria di un processo conosciuto?

In ogni caso ti ringrazio molto :ciauz:


Ma se stai iniziando a programmare con il C, a cosa ti serve questo tipo di informazioni?

Dovresti studiare i puntatori e tutto il resto nell'uso che si fa all'interno di un singolo processo ...

Qual e' la necessita' di "puntare celle di memoria" di un altro processo? Non penso sia argomento del primo capitolo di un libro di programmazione C ...

darkblOOd
14-09-2006, 17:14
no decisamente, hai ragione :D

il punto è che non sono bianco bianco di programmazione. Sono un programmatore informatico e lavoro da 6 anni. "Purtroppo" sono stato costretto al vb (vb6 all'inizio e adesso da 4 anni scrivo in vb.net).

In ogni caso quando comincio a studiare qualcosa lo faccio con attenzione e sto partendo dalle basi del C per arrivare poi alla programmazione ad oggetti del C++, che è poi il mio obiettivo finale. Mi sono soffermato a fare qualche riflessione sui puntatori, sulla loro natura e sul loro funzionamento. In linea di massima ho capito cosa sono, anche se non ho chiari ipotetici scenari in cui possano risultare indispensabili (non sto dicendo che sono inutili, anzi!) e ogni tanto mi parte qualche "sega mentale" :D

Volevo sapere se era possibile fare una cosa simile, visto che so che il C++ è abbastanza potente come linguaggio. Infatti non ho un motivo per il quale mi serva scrivere un programma simile, solo curiosità, sapere se è possibile recuperare un valore posto in una cella di memoria di un processo conosciuto.

UltraBeginner
14-09-2006, 17:18
Originariamente inviato da oregon
Non penso sia argomento del primo capitolo di un libro di programmazione C ...

Ehm decisamente no, i puntatori nel mio sono al capitolo 7 e ci sto sbattendo la testa :D :D (scusate l OT ) :biifu:

Loading