Größe eines long Array ermitteln?



  • long* pTrackList = new long[x];

    bekomm ich nun über den Pointer "pTracklist" die größe des Array (x) raus?? mit sizeof irgendwie?

    grüße



  • Nein bekommst du nicht (es sei denn, du vergräbst dich sehr tief in die Innereien deines Systems und schaust dort nach, wo new[]die Arraygröße gespeichert hat), darum ist es im praktischen Einsatz besser, du merkst dir die Größe und schleifst sie immer mit.
    (oder du nutzt vordefinierte Klassen, die das für dich übernehmen - z.B. std::vector<> oder CArray)

    PS: So oft, wie die Frage schon gekommen ist, hätte sie wohl einen Eintrag in der FAQ verdient.


  • Administrator

    Ja, aber dann bitte korrekt *g*
    Soweit ich weiss, kann man mit dem ursprünglichen Zeiger die grösse ermitteln.

    long* pl = new long[20]; // 20 als Beispiel, kann auch eine andere Zahl sein.
    long lx = sizeof(pl)/sizeof(long); // funktioniert, ergibt 20!
    

    Sobald der Zeiger aber ürbergeben wird oder was auch immer, funktioniert es nicht mehr:

    long* pl = new long[20]; // 20 als Beispiel, kann auch eine andere Zahl sien.
    long* pSecl = pl;
    long lx = sizeof(pSecl)/sizeof(long); // Ergibt die Zeigerlänge durch die Longlänge, auf 32 Bit Systemen also 1.
    

    Daher mit vorsicht zu geniesen und meistens wenn man mit dem ursprünglichen Zeiger arbeitet, so hat man eigentlich immer noch die Angabe, welche man gemacht hat für die Länge. Daher ist der Nutzen eher gering. Wird allerdings zum Beispiel bei der MFC in der Mainframe OnCreate Funktion genutzt für die Statusleiste.

    Grüssli



  • Da bist du falsch informiert - nur wenn du noch ein lokales Array hast, funktioniert das (sizeof wird zur Compilezeit ausgewertet):

    long al[20];
    size_t al_len=sizeof(al)/sizeof(long);// -> 20
    
    long* pl= new long[20];
    size_t pl_len=sizeof(pl)/sizeof(long);// -> je nach Adressraum-Größe dürfte das 0 oder 1 liefern
    

  • Administrator

    huups ... stimmt. Ganz vergessen, dass sizeof ja zur Compilezeit ermittelt wird. Ok dann gibt es keine sinnvolle Möglichkeit 😛 🤡

    Grüssli


Anmelden zum Antworten