reinterpret_cast und Daten im Speicher



  • Hallo !

    Es gibt zwar schon 100 Beiträge zum Thema casten und reinterpret_cast, dennoch habe ich mich entschlossen es noch einmal aufzugreifen.
    Bis vor kurzem habe ich mich immer erfolgreich darum gedrückt reinterpret_cast zu nutzen und stattdessen das implizite "C" casten <T> a = (T) b; genutzt.
    Dann gab es auf einmal ungeklärte Speicherfehler und seitdem ich reinterpret_cast nutze, treten diese nicht mehr auf. (Komisch)

    Wenn ich wie folgt nach C-Manier caste,

    long zahl = 123456;
    char *c_ptr = (char*)&l;
    

    wird doch die Adresse von zahl zur "Startadresse" vom char Zeiger gebogen.
    Was aber macht jetzt reinterpret_cast genau, um als sicher zu gelten ?

    Noch eine andere Frage. Ein char Vector (String) liegt bekanntlich hintereinander im Speicher ebenso wie ein Ganzahl Vector (richtig?).
    Wie liegt ein Struktur im Speicher ?

    Wenn man diese z.B. per memcpy in einen char Vector kopieren möchte, was muss man beachten/tun ? Folgendes klappt nämlich nicht.

    typedef struct {
      long a;
      long b;
    } struktur;
    
    struktur s;
    char *c = new unsigned char[sizeof(struktur)];
    
    memcpy(c, &s, sizeof(struktur));
    


  • Es ist dem Compiler überlassen wie die Struktur abgelegt wird.



  • HaJo. schrieb:

    Wenn man diese z.B. per memcpy in einen char Vector kopieren möchte, was muss man beachten/tun ? Folgendes klappt nämlich nicht.

    typedef struct {
      long a;
      long b;
    } struktur;
    
    struktur s;
    char *c = new unsigned char[sizeof(struktur)];
    
    memcpy(c, &s, sizeof(struktur));
    

    was klappt da nicht?? in c müssten dann die einzelnen bytes der long stehen...

    oder willst du dann in c die zahlen als String haben?? Das geht so nicht, da schreibst du dir am besten selber eine Funktion... entsprechendes dürfte auch in der FAQ stehen.



  • todo schrieb:

    was klappt da nicht?? in c müssten dann die einzelnen bytes der long stehen...

    oder willst du dann in c die zahlen als String haben?? Das geht so nicht, da schreibst du dir am besten selber eine Funktion... entsprechendes dürfte auch in der FAQ stehen.

    Wenn ich einen long mit dem Wert 12345 initialisiere, und ihn mittels reinterpret_cast in einen char caste, erhalte ich im char eine 90.

    Wenn ich beide longs der Struktur mit 12345 initilisiere und dann in einen ausreichend großen char kopiere, müsste ich doch 9090 darin stehen haben oder nicht ?

    MaSTaH schrieb:

    Es ist dem Compiler überlassen wie die Struktur abgelegt wird.

    Ja, im VC ist der Standard ja mit 8 Byte definiert, aber was das jetzt im einzelnen heißt, weiß ich leider nicht. In der MSDN steht auch nichts näheres.

    P.S.: Wäre nett wenn mir jemand noch einmal den ersten Teil mit "reinterpret_cast" erklären könnte. 😉



  • nein, du reinterpretest ja nicht den long, sondern wenn ja einen pointer da drauf... (zumindest bei deinem beispiel mit memcpy()) wenn du natürlich ein

    long i = 12345;
    char c = reinterpret_cast<char> (i);
    

    machst, ist es klar, da wird das letzte byte von dem long in den char kopiert...


Log in to reply