Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]Accesso indirizzo grezzo

    ciao.
    La mia domanda è questa:
    se ho una variabile int o WORD o DWORD che ha un indirizzo valido che punta ad un oggetto in c++ nello heap.
    come faccio a accedere a quel preciso oggetto dal suo indirizzo?
    tutti gli indirizzi sono riferiti ad oggetti della stessa classe.
    posso fare un cast?
    o è troppo pericoloso?
    che tipo di cast è meglio utilizzare?

    grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    posso fare un cast? o è troppo pericoloso?
    Sarà anche pericoloso ma che io sappia non esiste in C/C++ un meccanismo che controlli se a un indirizzo di memoria contenuto in un int c'è un oggetto di una certa classe.
    Vedi per esempio:
    http://stackoverflow.com/questions/9...a-void-pointer
    http://stackoverflow.com/questions/6...check-validity
    http://www.velocityreviews.com/forum...d-pointer.html

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie.

  4. #4
    Intendi dire che l'indirizzo è memorizzato all'interno - ad esempio - di una DWORD? In tal caso il cast giusto è un reinterpret_cast.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    scusa, ho postato prima del tuo intervento.
    DOve sta la differenza tra lo static cast e il reinterpret cast?

  6. #6
    static_cast può fare cast aritmetici, cast tra puntatori/riferimenti nella stessa gerarchia di classi e un po' di altre cose; trovi tutti i dettagli nello standard (§5.2.9) (nota comunque che i cast tra puntatori a classi polimorfiche vanno fatti con dynamic_cast se non c'è la certezza assoluta che il cast sia valido).
    Per fare una conversione "selvaggia" tra puntatori e interi (o tra puntatori di tipi incompatibili), invece, bisogna usare il reinterpret_cast; l'idea del reinterpret_cast è che il risultato del cast in sé non è ben definito, ma se uno fa un reinterpret_cast in un verso e poi nell'altro il risultato è valido (a patto che il tipo intermedio sia di dimensioni adeguate).
    Ovvero, se faccio int * => DWORD => int * riottengo lo stesso puntatore (se sizeof(DWORD)>=sizeof(int *)); d'altra parte, se faccio int * => char => int * (in cui, salvo piattaforme strane, sizeof(char)<sizeof(int *)) con ogni probabilità non riotterrò il mio puntatore originale.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.