Verständnissfrage zu arrays



  • hallo,

    wenn ich folgenden Code ausführe erhalte ich eine Ausgabe obwohl ich doch auf das 3 te Element gar nicht zugreifen dürfte... Warum ist das so? und warum erhalte ich immer unterschiedliche Ausgaben?

    char test[]={'A','B'};
    printf("%x",test[3]);
    

    Danke sehr!



  • PaulSonne schrieb:

    wenn ich folgenden Code ausführe erhalte ich eine Ausgabe obwohl ich doch auf das 3 te Element gar nicht zugreifen dürfte... Warum ist das so? und warum erhalte ich immer unterschiedliche Ausgaben?

    Was wäre denn die Alternative? Bzw. was denkst Du müsste passieren? und auf welcher Grundlage?

    PS: Übrigens gibt es nur die Elemente 0 und 1. Du greifst mit Index 3 sogar auf ein (theoretisches) 4tes Element zu.



  • Da ich ja nur 2 Elemente initialisiere dürfe ich doch theoretisch nur auf [0] und [1] zugreifen können. Erwarten würde ich einen Speicherzugriffsfehler...



  • Die Programmiersprache C hat keine internen Kontrollmechanismen gegen solche Fehler. Du liest einfach fremden Speicher aus, deswegen auch die unterschiedlichen Werte. Einen Zugriffsfehler kann es dabei geben, ich vermute aber mal eher beim Schreiben statt Lesen. Probier es aus, aber vorher sicherheitshalber ungesicherte Dokumente usw speichern.



  • Ach ja, es gibt wie gesagt keine Kontrollmechanismen zur Laufzeit (wenn das Programm ausgeführt wird), aber während des Kompilierens erkennt der Compiler den Fehler und warnt:

    warning: array subscript is above array bounds [-Warray-bounds]

    Immer das maximale Warnlevel aktivieren! (GCC: zusätzlicher Parameter -Wall)



  • Ich hab das mal ausprobiert. Bei mir war es jetzt eben gerade jedenfalls so: Das Array war mit 3 Elementen deklariert, aber ich konnte problemlos bis "Element" 100.000 beschreiben. Wenn ich den Speicher mit malloc() reserviere bricht das Programm teilweise schon vor Element 250 ab (mit blödsinnigem Returncode). Eine richtige Absturzmeldung bekomme ich nur wenn ich zufällig Speicher beschreibe, à la ((int)4865827)=42;

    (Ja, mir war langweilig...)



  • kartoffelbratgerät schrieb:

    Ich hab das mal ausprobiert. ...

    UB halt.



  • Vielen Dank erstmal für die Antworten. Auf welchen Speicher greife ich denn da zu?



  • PaulSonne schrieb:

    Vielen Dank erstmal für die Antworten. Auf welchen Speicher greife ich denn da zu?

    Probier mal:

    char vor[] ={'V','O'};
    char test[]={'A','B'};
    char nach[]={'C','H'};
    printf("%x",test[3]);
    

    Muss aber nicht immer so sein.


Anmelden zum Antworten