Pointer spielerei



  • out schrieb:

    Der Zeiger untersucher! schrieb:

    void blup(char *a, char  *b)
    {
        while ( *a = *b );
    }
    

    *a zeigt ja dann auf *b

    Somit endet es in einer Endlosschleife.

    Eventuell. Erstmal ist a der Zeiger, und nicht *a. Zweitens könnte in *b der Wert 0 stehen, sodass die Schleife abbricht.

    Ich hoffe ich störe nicht mit einer Zwischenfrage :).
    "=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?
    Oder fliegt dann eine Exception ? Wegen Null-Pointer ?



  • martin_zi schrieb:

    "=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?

    Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)



  • SeppJ schrieb:

    *a++; // *a zeigt auf den Nullterminator

    Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.

    *a++; // *a zeigt auf vielleicht auf den Weg zum Millionär 😃 (undefiniertes Verhalten^^)

    Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.

    Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?



  • cooky451 schrieb:

    martin_zi schrieb:

    "=" ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?

    Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)

    Achne 😮 .. tatsächlich .. ich bin doch etwas geschockt das mir das noch nicht so bewusst war 😮



  • out schrieb:

    Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?

    In dem Beispiel ist das nicht undefiniert, aber das hier

    const char* p = "A";
    ++p;
    *++p;
    

    schon.



  • out schrieb:

    SeppJ schrieb:

    *a++; // *a zeigt auf den Nullterminator

    Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.

    *a++; // *a zeigt auf vielleicht auf den Weg zum Millionär 😃 (undefiniertes Verhalten^^)

    Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.

    Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?

    Nein, einen wilden (oder Null-) Zeiger auch nur zu dereferenzieren ist UB.


  • Mod

    out schrieb:

    Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?

    Ja sicher. Die Adresse könnte zum Beispiel gar nicht gemappt sein.



  • Hallo,

    cooky451 schrieb:

    In dem Beispiel ist das nicht undefiniert

    Klar ist das "undefiniert": http://ideone.com/2E6cm

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    cooky451 schrieb:

    In dem Beispiel ist das nicht undefiniert

    Klar ist das "undefiniert": http://ideone.com/2E6cm

    C Noob. 😉 http://ideone.com/oWQKp



  • Probe-Nutzer schrieb:

    Hallo,

    cooky451 schrieb:

    In dem Beispiel ist das nicht undefiniert

    Klar ist das "undefiniert": http://ideone.com/2E6cm

    Nein, es ist nicht undefiniert.

    int main()
    {
        char *a="A";
    

    soweit ists ja klar, denke ich.

    *a++;
    

    hier wird nun a dereferenziert ('A' als ergebnis) und der Zeiger wird um 1 erhöht.

    *a++;
    

    hier wird nun der erhöhte Zeiger dereferenziert ('\0' als ergebnis) und der Zeiger wird um 1 erhöht und zeigt somit auf Speicherbereich der wahrscheinlich nicht mehr uns gehört. Aber solange er nur zeigt ist das OK.

    Ein weiteres

    *a++;
    

    wäre undefiniert.


Anmelden zum Antworten