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



  • 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.



  • da gibts die perversesten sachen. die hcs12xxx-prozessoren von freescale wurden im laufe der zeit immer weiter aufgebohrt. aus einem ursprünglich 16 bit breiten adressraum wurden 4mb indem in gewisse bereiche 8k-pages eingeblendet werden können, andere dagegen fest sind. das geht über ein sogananntes paging register. nun kann man das paging-register und die 16-bit adresse mit bitverschiebungen und oder-verknüpfungen in einen 24-bittigen adressraum umwandeln, den man in c über far* verwenden kann. nach dem reset hat das paging-register den wert 0xe0. ein 'void *far p = NULL;' besteht also aus 3 bytes. ich weiss nicht mehr genau wie man das berechnet aber ich glaub der sah so aus: 'e0 c0 00', was die 'globale adresse' 0x000000 repräsentiert.


Anmelden zum Antworten