Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212

    associare valore hex a puntatore

    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++

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...

  3. #3
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.

  5. #5
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    infatti ho fatto una prova ed avevo immaginato...

    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

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: associare valore hex a puntatore

    Originariamente inviato da darkblOOd
    So che un puntatore deve puntare ad un'area di memoria che contiene un valore dello stesso tipo
    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.
    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 = 0x23ff45
    Certo 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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212

    Re: Re: associare valore hex a puntatore

    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:

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da darkblOOd
    infatti ho fatto una prova ed avevo immaginato...

    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

    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 ...

  9. #9
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    no decisamente, hai ragione

    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"

    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.

  10. #10
    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 (scusate l OT )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.