Zeiger Cast - Verständnis Frage



  • Kann mir jemand folgenden Code erklären? Insbesondere Zeile 10.

    struct TESTSTRUCT
    {
    	int test;
    };
    
    //...
    
    void Test(void *testptr)
    {
    	TESTSTRUCT *teststr = reinterpret_cast<TESTSTRUCT *>(testptr);
    
    	//...
    	//...
    }
    

    Was genau bewirkt diese Zeile? Zeigt teststr jetzt auf testptr oder wird die Adresse übernommen? 🙄



  • teststr zeigt auf das Objekt hinter testptr. Du sagst dem Compiler, dass du jetzt einen Zeiger vom Typ TESTSTRUCT haben möchtest und kannst dann das hier machen:

    std::cout << teststr->test;
    

    Das geht mit testptr z.B. nicht.



  • Es wird lediglich der Typ des Zeigers von void* in TESTSTRUCT* gecastet. Wobei fraglich ist, wieso genau da mit void* gearbeitet wird, in C++ sollte das relativ selten nötig sein. Abgesehen davon, wäre ein static_cast ausreichend...



  • Casts von und zu void * sind ein wenig heikel, da sie nicht wissen, welches Objekt sich dahinter verbirgt, und du für die Richtigkeit des Casts zuständig bist. Der Compiler bekommt u.U. auch nicht mit, dass du krumme Sachen in deinem Code schreibst. Dereferenzieren kannst du sie sowieso nicht.

    Edit: Stroustrup schrieb mal dazu

    Functions using void* pointers typically exist at the very lowest level of the system, where real hardware resources are manipulated.
    Occurrences of void* at higher levels of the system should be viewed with suspicion because they are likely indicators of design errors.

    Ich würde versuchen solche Typumwandlungen meiden, wenn es nur möglich ist. Man sollte sich auf jeden Fall überlegen, ob Funktionsüberladungen, Templates, smart pointers, etc. nicht eine bessere Alternative für den Ansatz sind.


Anmelden zum Antworten