Hilfe bei Codeverständnis



  • Folgender Code:

    # include <iostream >
    int main() {
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    std::cout << "a:\t" << a << std::endl;
    int * iPtr[11] = {0}; // Sentinel
    for ( int i = 0; i < 10; i += 1) {
    iPtr[i] = &a[i];
    }
    int ** iiPtr = iPtr;
    do {
    std::cout << "Adr:\t" << *iiPtr << "\t **iiPtr: " << **iiPtr << std::endl;
    } while (*(++iiPtr));
    }
    

    Es tut mir leid, aber ich verstehe nicht, wie das Wächterelement arbeitet. Ich mache das Array von iPtr um ein Feld größer und plötzlich fängt es alle größeren Zugriffe ab?
    Also beispielsweise auch *(iPtr+15)... wieso?? 😮 😮
    Ich will nicht mehr so klein und doof sein.


  • Mod

    Da hast sich jemand ein nullterminiertes Array gebastelt. Beachte, dass iPtr 11 Elemente hat, nicht 10. Die ersten 10 zeigen auf die Elemente des ursprünglichen Arrays, das letzte wurde auf 0 gesetzt. Die Schleife läuft, bis sie auf den Nullzeiger trifft.

    Ich hoffe, du nimmst das nur als Übung, nicht als eine Technik, die man jemals so benutzt.



  • Es fängt keine größeren Zugriffe ab. Die while-Schleife läuft einfach bis zum ersten Arrayeintrag der gleich null ist. Das wars, keine Magie.



  • Super, das ist schon mal eine erste Hilfe.
    Nee, das war nur ein Beispiel, wie ein Wächterelement arbeiten kann.
    Da ich ein absoluter Anfänger bin, habe ich aber noch eine Frage:

    Wie kommt es nun, dass, wenn ich *(iPtr+15) ausgeben lasse, ich als Ausgabe "CCCCCCCCCC" erhalte?



  • Arraysstinken schrieb:

    Wie kommt es nun, dass, wenn ich *(iPtr+15) ausgeben lasse, ich als Ausgabe "CCCCCCCCCC" erhalte?

    Das Array hat nur elf Elemente. Wenn du versucht, höhere Elemente auszulesen, kommt Quatsch raus.



  • Und damit du "Quatsch" gleich identifizieren kannst, schreibt dein Compiler da im Debug-Modus leicht erkennbare Zahlen wie CCCC hin.



  • Ich liebe dieses Forum. Danke!!
    👍 👍 👍 👍 👍



  • Bashar schrieb:

    Und damit du "Quatsch" gleich identifizieren kannst, schreibt dein Compiler da im Debug-Modus leicht erkennbare Zahlen wie CCCC hin.

    Echt?

    Also ist das quasi so als Warnung zum einfacher Fehler finden?
    Machen das alle Compiler? Oder nur MSVC oder sonstwer?



  • Ich weiß es nur für den MSVC, aber ich nehme an, dass das andere auch machen.


Anmelden zum Antworten