Adresse von \0 einfaches Probleme



  • Hallo!

    Folgender Quelltext ist gegeben

    #include <stdio.h>
    #include <string.h>

    void main(){

    char cFeld[4]={'a','b','c','d'}; // 9997 9998 9999 10000
    printf ("%p %p %p %p \n",cFeld[0],cFeld[1],cFeld[2],cFeld[3]);

    }

    Was steht an adresse 10001 ? \0 oder was sonst? ich bekomme da immer 000000 raus wieso?

    Danke 👍



  • Astreines C#...



  • warum antwortest du nicht ordentlich? ist doch C



  • C != C#

    Speicherstelle '10001' ist in deinem Code nicht definiert - Da kann stehen was will.



  • Und wo steht dann \0 , ich meine irgendwo muss ja der Compiler wissen, wann die Zeichenkette zuende ist und das wird ihm doch durch \0 Signalisiert



  • Hier gibt es im ganzen Programm keine Zeichenkette, nur ein Array von Zeichen, dessen Größe sogar explizit angegeben wird. Diese Größe ist vier (in Zahlen: 4), also hast Du an der fünften Position nichts zu suchen. Dort kann stehen was will und Dein Computer darf sogar explodieren, wenn Du darauf zugreifst ("undefiniertes Verhalten").



  • Immer noch falsche Forum. Toller Karnevaljoke. 👎



  • SeboStone schrieb:

    Immer noch falsche Forum. Toller Karnevaljoke. 👎

    Ich denke das wurde inzwischen begriffen, aber die Antworten auf die Frage werden deshalb nicht falscher. Wenn der OP die Frage im C-Forum nochmal stellt, wird er wegen Doppelpost angeblafft, drum warte doch einfach auf die Verschiebung 😉



  • Generell:

    printf ("%p %p %p %p \n",cFeld[0],cFeld[1],cFeld[2],cFeld[3]);
    

    Gibt die Werte an den Stellen 0...3 des cFeld char Arrays aus.
    Durch die Formatierung %p gibts Du sie allerdings mit einer für Pointer sinnvolle Formatierung aus. D.h. es wird als 32bit Hex Zahl ausgegeben

    char c = cFeld[0]; // c == 'a' ist als Zahlenwert in Hex 0x61
    // Dies wird dann als 00000061 ausgegeben.
    

    Dann:

    Was steht an adresse 10001 ? \0 oder was sonst? ich bekomme da immer 000000 raus wieso?

    Ich bin mir nicht sicher was Du mit der Frage meinst. Fragst Du danach was an der Stelle cFeld[4] ist?
    Dann ist die Antwort: Nicht definiert, Zufall. (Wie schon erwähnt von geeky.)
    In der Regel ist es im Debug Mode ein dediziertes Muster, um Bufferüberläufe zu erkennen.
    Es können dort durch das Padding auch Nullen stehen. Es ist nicht erlaubt auf diesen Speicher Zuzugreifen!!

    Weiter:

    Und wo steht dann \0 , ich meine irgendwo muss ja der Compiler wissen, wann die Zeichenkette zuende ist und das wird ihm doch durch \0 Signalisiert

    Mit

    char cFeld[4]={'a','b','c','d'};
    

    definierts Du ein char Array. Das ist keine Zeichenkette. Es wird desshalb auch kein terminierendes Null eingefügt. Zeichenketten definiert man so:

    char str[] = "abcd";
    char c = str[4]; // c == '\0'
    

    Gruss Simon



  • LordJaxom schrieb:

    Ich denke das wurde inzwischen begriffen, aber die Antworten auf die Frage werden deshalb nicht falscher. Wenn der OP die Frage im C-Forum nochmal stellt, wird er wegen Doppelpost angeblafft, drum warte doch einfach auf die Verschiebung 😉

    Ich bin ganz und gar kein geduldiger Mensch, am frühen Morgen erst recht nicht! 😃 Sei's drum, hast ja recht.



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten