wo zeigt der Pointer hin?



  • Bashar schrieb:

    2. Einen Nullzeiger zu inkrementieren führt zu zu undefiniertem Verhalten.

    du meinst sowas:

    int *p = (int*)0;
    p++;  // zeigt jetzt auf die adresse 'sizeof(int)'
    

    ist undefiniert?
    😕



  • Ja, Pointerarithmetik ist nur für Zeiger, die auf Objekte (bzw. eigentlich nur Arrays, aber ein einzelnes Objekt wird in dem Zusammenhang als Array der Länge 1 angesehen) zeigen, definiert.



  • Bashar schrieb:

    Ja, Pointerarithmetik ist nur für Zeiger, die auf Objekte (bzw. eigentlich nur Arrays, aber ein einzelnes Objekt wird in dem Zusammenhang als Array der Länge 1 angesehen) zeigen, definiert.

    naja, nun kann sich aber an der adresse 0 doch etwas sinnvolles befinden (wie z.b. bei ARM prozessoren eine vektortabelle aus acht 32-bit werten). im iso/iec steht z.b. das:

    Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer,

    schon mal dumm, aber dass inkrementieren von 0-pointern undefiniert ist, konnte ich dort nicht finden.
    🙂



  • hab 0 plan vom 0 pointer schrieb:

    naja, nun kann sich aber an der adresse 0 doch etwas sinnvolles befinden (wie z.b. bei ARM prozessoren eine vektortabelle aus acht 32-bit werten).

    Ja.

    im iso/iec steht z.b. das:

    Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer,

    schon mal dumm, aber dass inkrementieren von 0-pointern undefiniert ist, konnte ich dort nicht finden.
    🙂

    Das steht beim + und - Operator.



  • Bashar schrieb:

    Das steht beim + und - Operator.

    ich muss heute mit blindheit geschlagen sein. ich find's nicht 😕



  • 6.5.6 im c99 Draft, §8:
    " If both the
    pointer operand and the result point to elements of the same
    array object, or one past the last element of the array
    object, the evaluation shall not produce an overflow;
    otherwise, the behavior is undefined."
    Schwer zu finden, ich gebs zu.



  • Bashar schrieb:

    6.5.6 im c99 Draft, §8:
    " If both the
    pointer operand and the result point to elements of the same
    array object, or one past the last element of the array
    object, the evaluation shall not produce an overflow;
    otherwise, the behavior is undefined."
    Schwer zu finden, ich gebs zu.

    na ich weiss nicht. diesen satz hatte ich auch schon unter verdacht, aber daraus undefiniertes verhalten beim hochzählen eines 0-pointers abzuleiten ist doch ziemlich weit hergeholt.
    🙂



  • draft punk schrieb:

    na ich weiss nicht. diesen satz hatte ich auch schon unter verdacht, aber daraus undefiniertes verhalten beim hochzählen eines 0-pointers abzuleiten ist doch ziemlich weit hergeholt.
    🙂

    Bashar schrieb:

    "If both the pointer operand [...] point to [...]"

    Nicht erfüllt (Nullzeiger "don't point to"), ergo otherwise, ergo undefined. Wieso ist das weit hergeholt?



  • LordJaxom schrieb:

    Bashar schrieb:

    "If both the pointer operand [...] point to [...]"

    Nicht erfüllt (Nullzeiger "don't point to"), ergo otherwise, ergo undefined. Wieso ist das weit hergeholt?

    na deshalb, beispiel:

    uint32_t *arm_vector_table = (uint32_t*)0;  // hier befindet sich ein array mit einigen 32-bit werten
    arm_vector_table++;  // zeigt jetzt auf den 'unknown instruction vector'
    

    das klappt, ist bestenfalls 'implementation defined'
    🙂



  • Du verstehst einfach den Begriff undefined nicht, das ist alles.



  • was gibts da nicht zu verstehen?



  • man kanns ein zu eins ins deutsche übersetzen. es bedeutet so viel wie 'darüber wird hier nix gesagt' und in dem von dir geposteten satz aus dem c-std wird eben gar nichts erzählt über das hochzählen eines null-pointers.

    sorry, wegen spamsperre zerteilt.



  • aber schon witzig. obwohl der C-standard die sprache ziemlich genau beschreiben soll,



  • i-s-t e-s d-o-ch l-u-s-t-i-g, w-i-e v-ie-l ra-um die-ses doku-ment f-ür eig-ene
    int-erp-ret-ationen lä--sst.



  • aber die spamsperre liess den text nicht anders durch 😞



  • "undefined" bedeutet, daß der Standard nicht festlegt, was passieren soll - das sind Grenzfälle, die in die Hände des Compilers gelegt werden (und die man in normalen Programmen besser vermeiden sollte). "implementation defined" sind Details, bei denen der Standard Vorgaben macht, unter denen sich der Compiler eine aussuchen darf/muß (z.B. der Wertebereich von 'char').

    (portabel kannst du dich auf keins von beidem verlassen - aber "implementation defined" Features führen normalerweise nicht zum Absturz)


Anmelden zum Antworten