Länge eines Arrays



  • Nein, es gibt eigentlich nicht viel Sinn. Es ist halt nur Interesse. Und in C würde das wieder Sinn machen, da es ja die STL nicht gibt.



  • Es gibt keine Standardfunktion um die Länge eines Arrays zu bestimmen von dem nur ein Zeiger auf das erste Element vorhanden ist.

    (Wenn Du die Länge weisst um zu allokieren - ganz einfache Lösung: Merke sie Dir)



  • DU kannst sizeof verwenden.

    Aber Achtung sizeof zählt die Anzahl der belegten bytes im Speicher. Also sollte

    int tmp[265];
    int len = sizeof(tmp);
    

    len 1024 ergeben, da jedes int element im Speicher 4 Bytes belegt.
    Besser wäre das:

    int tmp[265]
    int len = sizeof(tmp)/sizeof(int);
    

    Das sollte genau 256 ergeben.
    Das zweite sizeof ist nur, falls du nicht weißt wie viele Bytes ein Objekt im Speicher belegt.



  • @SALOMON:
    Bringt bei o.a. Beispiel mit new nur überhaupt nix 😉



  • Ja du hast recht.
    Habe gerade auch ein wenig rumprobiert, aber scheinbar ist das nur schwer möglich?!



  • Was ist schwer möglich?!

    Sizeof() liefert die Länge in Bytes - bei einem Array ist das die Länge des Array multipliziert mit der Länge eines Elements, bei einem Zeiger auf das erste Element eines Arrays ist es die Länge eines Zeigers auf der betreffenden Plattform.

    int ary[100];
    int *bry = ary;
    
    sizeof(ary); // auf x86 400 Bytes
    sizeof(bry); // auf x86 4 Bytes
    


  • Ja das ist mir schon klar. Ich meinte, dass man einen Zeiger mit new initialisiert und dann die Arraygröße bestimmen möchte.



  • Ich nehme mal an, dass es dem Compiler überlassen ist, wie er das handhabt. Z.B. könnte er die Länge an void* (ptr) - 1 speichern. Damit würde ichs mal probieren.



  • Mich wundert es nur, dass es eben keine solche Funktion zu geben scheint, obwohl sich die Implementierung des Speicherverwaltung ja sehr wohl die Länge des allokierten Arrays merken muss. Könnte mir höchstens vorstellen das die Speicherverwaltung in Blöcken zu ,sagen wir mal 256 Bytes, organisiert ist. Wenn man ein Array der Länge 20 Bytes allokiert, dann kann es also durchaus sein das trotzdem intern 256 Bytes allokiert werden. Somit fehlt die Information über die eigentliche Größe.
    (Das ist mir die einzigste Erklärung und vlt. habe ich mir damit die Frage selbst beantwortet) 🤡



  • Eine solche Funktion hätte aber rein garnichts mit der Länge des Arrays zu tun. Sie würde Dir nur verraten, wie lang ein allokierter Block ist, und das auch nur wenn Du dieser Funktion den Anfang des Blocks übergibst.

    In der aktuellen c't gibt es einen Artikel über Heap-Overflows, dort wird eine sehr einfache Heap-Struktur beispielhaft skizziert. Würde man diese zugrunde legen, wäre es schon nicht mehr möglich zuverlässig zu sagen ob ein solcher Block an den Anfang eines allokierten Bereichs zeigt. Tut er das nämlich nicht, würde eine Längenermittlung Müll liefern, also undefinierte Werte.

    Einfaches Beispiel (ok, in C++ wohl nicht so üblich, in C aber schon verbreitet)

    typedef struct {
      int a, b;
      char *c;
    } bla;
    
    bla *x = malloc(sizeof(bla) + 100);
    x->c = x + 1;
    strcpy(x->c, "LordJaxom");
    

    Wie sollte die Speicherwervaltung nun die Länge von bla::c ermitteln, wenn sie nicht weiss dass der Speicher mittendrin im allokierten Block liegt?

    Ich meine die Sprache bietet sowas aus gutem Grund nicht an.


Anmelden zum Antworten