Zeiger, ein Element weiter rausgehen



  • Ist sowas als Abbruchbedingung überhaupt erlaubt, oder schlechter Stil? Wer macht dass auch so?

    int main()
    {
        int array[5] = {23,63,1,42,2};
        int *source = array;
    
        while(source != &array[5])
        {
            cout << *source << endl;
        }
    
        return 0;
    }
    

    Ich stell mir dass so wie den end-iterator vor...!?
    Funktionieren tuts zumindestens.

    MfG
    Stromberg


  • Administrator

    Wenn ich überhaupt jemals so einen Fall habe (was sehr selten ist!), dann mache ich das so:

    int main()
    {
      int array[5] = { 23, 63, 1, 42, 2};
    
      int* iter = &array[0];
      int* end = iter + 5;
    
      for(; iter != end; ++iter)
      {
        std::cout << *iter << std::endl;
      }
    
      return 0;
    }
    

    Der Grund dafür ist, dass du durch den Zugriff über den Index-Operator automatisch das Element auch dereferenzierst. Du greifst somit auf Speicher zu, zwar nur lesend, der dir nicht gehört. Ein Zeiger dagegen kannst du überall hinzeigen lassen, das ist kein Problem.
    Ich bin mir jetzt nicht ganz sicher (und zu faul nachzuschauen), aber ich meine das Verhalten in deinem Fall ist undefiniert. Der Kompiler optimiert es wahrscheinlich weg, weswegen es funktioniert. Aber Zugriff auf Speicher, der einem nicht gehört, ist im allgemein undefiniertes Verhalten. Egal ob man liest oder schreibt.

    Grüssli



  • Undefiniert.

    Auf keinen Fall machen, mit etwas Pech könnte aus so einem Programm Skynet werden.



  • The-Kenny schrieb:

    Undefiniert.

    Falsch.

    Zumindest die Variante von Dravere ist nicht undefiniert, da es im Standard extra eine Ausnahme für das "one past last" Element von Arrays gibt.

    Grund für diese Ausnahme ist vermutlich damit sich Iteratoren von z.B. std::vector einfacher und performanter implementieren lassen (nämlich als einfacher Zeiger).

    Ich glaube aber auch nicht dass die Schreibweise &array[size] "OK" ist. Lieber &array[0] + size.

    Es wird zwar nichts wirklich gelesen, aber zumindest von der Syntax her wird bei &array[size] ein Element dereferenzeiert welches garnichtmehr existiert.



  • Stromberg, wie kommt es, dass du immer sehr ähnliche Fragen stellst?

    Die Thematik mit One Past Last wurde hier schon erläutert.



  • 1. Stell ich nicht "immer" sehr ähnliche Fragen, dass eins der ersten Male.
    2. Ich leide an schwerem Alzheimer, und vergesse aufgrund dessen öfter ältere Beiträge. Doch ist Alzheimer ein Grund um mich zu verachten? Darf ich trotzdem nicht wie jeder andere Mensch diese Forum benutzen? Wieviel Zeit bleibt mir noch bis das Alzheimer mein komplettes Gehirn zerfressen hat? Ich möchte diese Zeit noch nutzen. Bitte habt Verständnis für meine "kleine" Behinderung und toleriert diese.

    MfG
    Stromberg



  • Tut mir leid, ich wollte dich wirklich nicht kränken.

    Es gibt nur gewisse Leute, die oft die selben Fragen stellen, weil sie sich nicht mit den Antworten der Leute befassen. Deshalb bin ich teilweise grundsätzlich etwas skeptisch, nimm das nicht persönlich. Aber ich bin froh, dass das bei dir nicht der Fall ist. Sorry nochmals.


Log in to reply