Standardtypen um Adressen und Offsets zu speichern?



  • Hi,

    gibt es Standardtypen die groß genug sind um a) eine Adresse zu speichern und b) ein Adressoffset zu speichern?

    Ich glaube für letzteres gibt es einen Typ diff_t, bin mir da aber nicht ganz sicher.

    Kurz zur Klarstellung: ich brauche hier keinen Zeiger auf den Bereich, sondern einen Integer der die Adresse speichert und möchte das möglichst generisch, so dass mein Code später auch unter 64Bit Systemen ohne Probleme zu machen läuft.



  • 'ptrdiff_t' sollte gehen. ich weiss aber nicht, ob es noch was passenderes gibt.
    🙂



  • Danke, das war der Typ den ich meinte. Ich habe nach ihm gegoogelt und zum einen ist er signed und zum anderen ist das Ergebnis nur definiert bei der Subtraktion zweier Pointer im gleichen Array.
    Aber ich denke mal, dass ich sicher annehmen kann, dass für jede Zeigerpaar a,b folgendes gilt: a + ( b - a ) == b, wobei b-a als ptrdiff_t dargestellt wird.

    Dann bleibt aber immernoch das Problem, dass ich gerne einen standardisierten Typen hätte der jede Adresse speichern kann. Wenn es da nichts gibt, muss halt ein Typedef her, das wäre zwar weniger schön, da ich aber eh x86 inline assembly an ein paar Stellen verwenden muss, muss ich so oder so extra Arbeit investieren, wenn ich das auf 64Bit umstellen will.



  • Der Typ, der eine Adresse speichert, ist der Zeiger. Ein allgemeiner Zeiger ohne Basistyp wäre void*.



  • intptr_t (aus stdint.h)

    Ist auch nicht 100% standardkonform, weil der nur void* kann, also keine Funktionspointer. Das kann bei segmentierten Architekturen relevant sein.

    Achja, das ist C99.



  • Ok, da kommen wir der Sache schon näher 🙂
    Problem: ich verwende vc und der kann leider kein C99, aber hoffentlich hat er wenigstens diesen Header

    Funktionszeiger muss ich dadurch nicht darstellen können. Ich brauche einfach nur die Adresse und muss an ein zwei Stellen aus dieser einen void*-Zeiger generieren, aber das ist ja kein Problem (oder?), insofern die Adresse gültig ist bzw. der Integertyp der sie speicher die gleiche Größe hat.



  • Ok, stdint.h kennt er nicht. Kann ich mit dem Präprozessor prüfen ob eine Datei existiert und in Abhängigkeit davon diese oder eine andere inkludieren?
    Ich kenne keinen Weg und befürchte, dass es nicht geht (außer per #define).



  • Sorry, für das Gespamme.

    Der VC kennt immerhin den Typ intptr_t, das ist ja schonmal was, da ich durch das inline-assembly eh an den VC gebunden bin ist der Header nicht so wichtig.

    Nochmal kurz zur Absicherung: mit intptr_t und ptrdiff_t kann ich Adressen und ihre Differenzen problemlos darstellen und ggf. void* Zeiger konstruieren?



  • Ok, ich muss doch noch einmal fragen. Ich habe folgendes Beispiel:

    intptr_t a = 0x8000ffff;
    intptr_t b = 0x8000cccc;
    ptrdiff_t diff = a - b; // ist das so, ohne Cast definiert?
    void* p = a; // dito
    


  • kannst du die zeiger nicht casten ?
    wenn du schon inline-assembler verwendest stört doch ein cast nicht ?



  • helferlein schrieb:

    kannst du die zeiger nicht casten ?
    wenn du schon inline-assembler verwendest stört doch ein cast nicht ?

    Ein Cast stört ja nicht, mir ist nur wichtig, dass ich das sauber schreibe, auch wenn der VC jetzt nicht meckert so warnt er zumindest bei der letzten Zeile und ich will später wenn ich das mal auf 64Bit portiere nicht eine Menge Stolperfallen drin haben.


Anmelden zum Antworten