char* x = "" das selbe wie char* x = NULL ?



  • ok, nochmal drüber nachgedacht, und stimmt, die erste variante wäre ja nicht NULL sondern '\0'.
    glaub ich zumindest.... 🙂



  • loki1985 schrieb:

    glaub ich zumindest.... 🙂

    Du glaubst richtig.



  • nein, wieder falsch.

    die erste variante zeigt auf ein '\0';
    die zweite variante zeigt nirgendwohin.



  • Hat er denn etwas gegenteiliges behauptet?



  • c.rackwitz schrieb:

    nein, wieder falsch.

    die erste variante zeigt auf ein '\0';
    die zweite variante zeigt nirgendwohin.

    lol



  • c.rackwitz schrieb:

    nein, wieder falsch.

    die erste variante zeigt auf ein '\0';
    die zweite variante zeigt nirgendwohin.

    ich glaube meine antwort schliesst das nicht aus...

    das NULL nix ist war mir auch schon klar..... raffe nur nicht wie das auf prozessor-ebene aussehen soll 😕
    aber das ist eine ganz andere geschichte....



  • TactX: ja. auf etwas zeigen und etwas sein sind verschiedene dinge.

    '\0' und NULL haben beide den gleichen zahlenwert, naemlich null:

    if ((int)'\0' == (int)NULL) puts("beide gleich"); else puts("ungleich");
    


  • ok, stimmt. hab mich schluderig ausgedrückt.... aber schuld sind die pointer, nicht ich. die pointer waren es!!! 😃



  • Ich sehe schon. Wir brauchen hier bald Sprachwissenschaftler die alles bis in's kleinste Detail aufdröseln... 🙄



  • 😃 die details konnte ich nicht unterschlagen, weil jemand mit so einer frage eventuell nicht wissen kann, was genau ich zu sagen versuche. wir beide kennen pointer gut genug, der OP brauchts aber fuer den anfang genau.



  • c.rackwitz schrieb:

    '\0' und NULL haben beide den gleichen zahlenwert, naemlich null

    Nope. '\0' hat garantiert den Wert null, also alle Bits sind 0. Ein Nullzeiger, und das repräsentiert NULL nunmal, nicht. Dessen Wert, also die Darstellung auf Bitebene, ist implementationsspezifisch.



  • edit:

    An integer constant expression with the value 0, or such an expression cast to type
    void *, is called a null pointer constant.55) If a null pointer constant is converted to a
    pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal
    to a pointer to any object or function.

    soll ich dir das dokument mal zukommen lassen?



  • '\0' <- Alle Bits sind sicher 0
    NULL <- Bits müssen nicht unbedingt 0 sein.

    http://c-faq.com/null/confusion4.html



  • TactX schrieb:

    NULL <- Bits müssen nicht unbedingt 0 sein.

    ist ja auch nur ein blödes #define



  • fairerweise muss gesagt sein:

    The macros are
    NULL
    which expands to an implementation-defined null pointer constant;



  • Wenn der Fall eintritt, dass NULL != 0 gilt, dann wäre folgendes doch nicht mehr länger gültig (für den Fall, dass malloc NULL returnt):

    int* p;
    if( !(p = malloc( sizeof( int ) ) ) )
    ;//do sth
    //do sth else
    


  • c.rackwitz schrieb:

    soll ich dir das dokument mal zukommen lassen?

    Nee, brauchst du nicht. Hab selber eines.
    Aber wie wäre es, wenn du mal lernst, den Text zu verstehen? 😉
    Es ging nicht darum, dass ein konstanter Ganzzahlausdruck mit dem Wert 0 beim Casten nach void* zu einem Nullzeiger wird. Es ging darum, dass der Wert eines Nullzeigers nicht zwangsläufig dem von '\0' entsprechen muss. Praktisch bedeutet das, dass dein Code je nach Plattform "beide gleich" oder "ungleich" ausgeben kann.

    Any schrieb:

    Wenn der Fall eintritt, dass NULL != 0 gilt

    Das ist nicht die Frage. Und der Fall tritt auch nicht ein. Warum? Das erklärt ua der Auszug von c.rackwitz.
    Die Frage war

    (int)'\0' == (int)NULL
    

    Und das Ergebnis des Vergleichs ist unbestimmt. (und ua auch nicht ganz korrekt, da int evtl. die Werte beschneidet)



  • sag doch einfach, dass ein cast den wert veraendert und die zahl 0 in irgendwas anderes umgewandelt wird (und wieder zurueck).
    mich wuerde aber trotzdem mal interessieren, wo man dieses verhalten beobachten kann. nur so interessehalber.

    edit:
    aehm, (void*)0 ist also nicht immer nur binaere nullen, aber...
    was waere dann (int)(void*)0



  • Schau dir das Kapitel über Zeiger an ➡ 6.3.2.3-6.



  • gemacht. und jetzt, nur aus neugier, wo kommt es vor, dass ein nullpointer nicht null ist oder ein pointer beim casten nach int (sofern int gross genug ist) einen anderen wert bekommt?

    mir ist klar, dass wir hier nicht mehr ueber ansi c reden, sondern ueber implementationen. und fuer die interessiere ich mich. denn wenn ich schon "atome sind teilbar" behaupten soll, dann will ich wenigstens auch wissen, in was.


Anmelden zum Antworten