arraygroesse



  • Guten Morgen!

    Wieso hat im folgenden Programm mein Array offensichtlich mehr Felder, als die Anzahl, die ich bei der Definition des Arrays angegeben hab?? Wenn ich z.B. beim Ausführen des Programmst als String "123" eingebe, dann stehen in dem Array mehr als nur die "1". Oder wie soll ich es sonst auffassen, dass "array[2]" mir die "3" ausgibt?
    An sich ist das doch eine so einfache und logisch Sache, wieso ist nur meine Ausgabe wieder so unlogisch... 😞
    Bin für jeden Hinweis dankbar!

    #include <iostream>
    #include <climits>
    using namespace std;

    int main()
    {
    char array1[1];
    cout << "Ersten String eingeben: " << endl;
    cin >> array1;
    cout << "Groesse 1: " << sizeof(array1) << endl;
    cout << "array1: " << array1[0] << array1[1] << array1[2]
    << array1[10] << array1 << endl;
    }



  • sowas nennt sich "undefiniertes Verhalten": der Eingabeoperator bekommt kein Array, sondern einen Zeiger auf den Anfang des Arrays, und hat keine Möglichkeit festzustellen, wieviel Platz ihm da eigentlich zusteht. Darum schreibt er einfach über das Ende des Arrays hinaus (und vertraut darauf, daß der Platz ausreicht).
    (da hast du übrigens Glück, daß du bei der Aktion keine lebenswichtigen Daten erwischt hast)

    Die sauberere Lösung wäre es, die Daten in einem mitwachsenden Container unterzubrigen - dein Beispiel schreit gerade nach "std::string array1;".



  • Du beschreibst einfach den nachfolgenden Bereich.
    Das ist nicht korrekt und führt zu undefiniertem Verhalten.
    Es ist in deiner Verantwortung, zu überprüfen, dass genügend Speicher reserviert ist.

    Generell stellt dies auch eine Sicherheitslücke dar.
    Grüsse Simon



  • Wenn du nur ein char willst, dann lies doch auch nur ein char ein und kein char-Array.
    char-Zeichenketten brauchen übrigens ein Terminierungszeichen: '\0'. Daher hat "123" die Länge 4.

    Oder benutz einfach std:string.



  • Vielen Dank für die schnellen und hilfreichen Antworten!!

    Schönes Wochenende...


Anmelden zum Antworten