Malloc und strings



  • C Anfänger schrieb:

    char *a is ja äquivalent zu a[0].

    Nein. Das ist eins der größten Missverständnisse überhaupt.



  • Bashar schrieb:

    C Anfänger schrieb:

    char *a is ja äquivalent zu a[0].

    Nein. Das ist eins der größten Missverständnisse überhaupt.

    Hmmm dann hab ich das bis jetzt auch immer missverstanden. Wo ist denn der Unterschied ?

    *a und a[0] dereferenzieren doch die selbe Addresse.



  • @prolog
    bashar meint vermutlich das bei der deklaration bzw. definition eines pointers der * (stern) nix mit dereferenzieren zu tun hat



  • Hmm achso, wenn dem so ist, dann hab ich es doch nicht missverstanden 😉



  • Also ich glaube nicht das a* das selbe ist wie a[0] weil die pointer adresse sich dynamisch im speicher adressiert und ein array eher statisch oder hab ich da was falsch verstanden?



  • cico schrieb:

    Also ich glaube nicht das a* das selbe ist wie a[0] weil die pointer adresse sich dynamisch im speicher adressiert und ein array eher statisch oder hab ich da was falsch verstanden?

    Ja. Beim Zugreifen ist die Notation a[n] definiert als *(a + n). Für n == 0 ergibt sich der Spezialfall, daß a+0 == a ist, also a[0] == *a.

    Was das mit Zeigern vs Arrays zu tun hat, ist mir nicht ganz klar.



  • also ist a[0] ein spezialfall?aber es wird doch ein element für a im speicher reserviert mit der größe null?also ist a ein array mit einem element mit der größe null....oder nicht?



  • cico schrieb:

    also ist a[0] ein spezialfall?aber es wird doch ein element für a im speicher reserviert mit der größe null?also ist a ein array mit einem element mit der größe null....oder nicht?

    Hallo.

    Du verwechselst

    char foo[n];
    mit
    foo[n];

    denk mal ueber den Unterschied nach.

    foo[0]
    ist natuerlich kein spezialfall - Daniel E. meint damit nur, dass a+0 zufaellig a ist, und man deswegen *a statt *(a+0) schreiben kann.



  • Achso!...



  • prolog schrieb:

    Hmmm dann hab ich das bis jetzt auch immer missverstanden. Wo ist denn der Unterschied ?

    *a und a[0] dereferenzieren doch die selbe Addresse.

    Ein Pointer ist ein Objekt, das als Wert den Speicherort eines anderen Objektes beinhaltet. Ein Array dagegen beinhaltet keine Adresse (egal ob es jetzt 0 oder sonstwieviele Einträge hat).

    Ein Array zerfällt in fast jedem Kontext (alles ausser sizeof, wenn ich mich nicht irre) in einen Pointer auf sein erstes Element, daher kommt wohl dieses Missverständnis, aber es ist kein Pointer.

    Oder anders ausgedrückt, das erste a ist ein lvalue eines Zeigertyps, das zweite kann zwar als Array ein lvalue sein, aber als Pointer nur ein rvalue.

    windalf schrieb:

    bashar meint vermutlich das bei der deklaration bzw. definition eines pointers der * (stern) nix mit dereferenzieren zu tun hat

    Das meinte ich nicht, und ich würde es auch nicht meinen wollen, weil es nicht stimmt. char *a; liest man am besten so: a ist ein Objekt, das, wenn ich es dereferenziere, auf einen char verweist, folglich muss a ein Zeiger auf char sein.



  • Bashar schrieb:

    Ein Array dagegen beinhaltet keine Adresse (egal ob es jetzt 0 oder sonstwieviele Einträge hat).

    hmm?soviel ich weiß reserviert das array für seine elemte auch adressen die allerdings von der größe alle gleich sind.


Anmelden zum Antworten