Wie groß darf ein char-Array sein?



  • sudo rm -rf schrieb:

    Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:

    double bla=1024*1024;
    char blub[bla];
    

    wenn ich jedoch auf folgende art das Array anlege, bekomme ich keine Fehler:

    char blub[1024*1024];
    

    weshalb?
    Darf man nicht so grosse Arrays anlegen?

    Wenn du keine dynamische Speicherverwaltung machst, muss die Größe eines Arrays konstant sein: ... und wieso nimmst du double?

    const int BLA = 1024*1024;
    char blub[BLA];
    
    int size = 1024*1024;
    char* pa = new char[size]; //dynamisch
    


  • oh klar, dachte double, weil double groß ist.
    ich dachte int hätte die größe von short, aber das passt ja rein...
    sorry und danke!



  • Int hat die Länge eines longs auf x86.
    Double und Float sind Gleitkommatypen mit unterschiedlicher Präzision.

    Mit C++0x gibts den Header cstdint. Dieser enthält zusätzlich Typen wie uint8_t, uint16_t, uint32_t, uint64_t, size_t, uintptr_t, int8_t, int16_t, int32_t und int64_t.



  • mr z schrieb:

    Int hat die Länge eines longs auf x86.

    Hängt vom Compiler ab. long dürfen nach C++-Standard durchaus sehr viel länger sein.

    Fellhuhn schrieb:

    Heap.

    Nö. Stack.

    Nukularfüsiker schrieb:

    Darf man nicht so grosse Arrays anlegen?

    Wenn der Stack groß genug ist, geht das. Aber 1 MB dürfte bei den Defaulteinstellungen schon hart an der Grenze sein.

    Man darfs durchaus versuchen. Ob das dann am Ende Funktioniert hängt vom Compiler und den Compilereinstellungen ab. Vom Standard her ist die Grenze std::numeric_limitsstd::size\_t::max()



  • sudo rm -rf schrieb:

    Hallo,
    ich habe bei einem Programm gerade folgendes Problem,
    ich versuche 1 MiB einer Datei in ein Chararray einzulesen.
    Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:

    double bla=1024*1024;
    char blub[bla];
    

    Das ist falsch, wie bereits mehrfach angemerkt wurde. Allerdings gibt es in C++ nur einen Datentyp, den man für Feldgrößen verwenden kann ohne Probleme zu bekommen "size_t". Das ist immer dann wichtig, wenn man über Felder iterieren will, und man alle Elemente garantiert erreichen will.

    #include <cstddef>
    
    size_t bla = 1024*1024;
    char blub[bla];
    


  • Naja, size_t ist auch nur ein typedef für unsigned long.



  • FreakY<3Cpp schrieb:

    Naja, size_t ist auch nur ein typedef für unsigned long.

    Nö.
    Kann auch ein Typedef auf was anderes sein. z.B. unsigned long long bei MSVC im 64 Bit Modus.

    p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als numeric_limits<ptrdiff_t>::max() sein, wenn numeric_limits<ptrdiff_t>::max() < numeric_limits<size_t>::max() ?



  • hustbaer schrieb:

    FreakY<3Cpp schrieb:

    Naja, size_t ist auch nur ein typedef für unsigned long.

    Nö.
    Kann auch ein Typedef auf was anderes sein. z.B. unsigned long long bei MSVC im 64 Bit Modus.

    War nur darauf bezogen, dass es kein eigener Datentyp ist :p



  • hustbaer schrieb:

    FreakY<3Cpp schrieb:

    Naja, size_t ist auch nur ein typedef für unsigned long.

    Nö.
    Kann auch ein Typedef auf was anderes sein. z.B. unsigned long long bei MSVC im 64 Bit Modus.

    p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als numeric_limits<ptrdiff_t>::max() sein, wenn numeric_limits<ptrdiff_t>::max() < numeric_limits<size_t>::max() ?

    klar - wieso nicht?
    und: ptrdiff_t::max < size_t::max sollte imho immer gelten
    weil signed_x::max < unsigned_x::max...

    bb



  • unskilled schrieb:

    hustbaer schrieb:

    FreakY<3Cpp schrieb:

    Naja, size_t ist auch nur ein typedef für unsigned long.

    Nö.
    Kann auch ein Typedef auf was anderes sein. z.B. unsigned long long bei MSVC im 64 Bit Modus.

    p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als numeric_limits<ptrdiff_t>::max() sein, wenn numeric_limits<ptrdiff_t>::max() < numeric_limits<size_t>::max() ?

    klar - wieso nicht?
    und: ptrdiff_t::max < size_t::max sollte imho immer gelten
    weil signed_x::max < unsigned_x::max...

    bb

    Schon klar dass ptrdiff_t::max < size_t::max der "übliche" Fall ist.

    Warum nicht? Weil das Ergebnis einer Subtraktion zweier Zeiger ein ptrdiff_t ist. Wenn ich nun ein char-Array hernehme das grösser ist als ptrdiff_t::max, und dann array[n] - array[0] rechne, dann bekomme ich nen festen Topfen heraus. Vermutlich nicht im Sinne des Erfinders 🙂



  • FreakY<3Cpp schrieb:

    Naja, size_t ist auch nur ein typedef für unsigned long.

    Das garantiert die Norm aber nicht! Dagegen ist es garantiert, daß man mit size_t alle Elemente eines Arrays adressieren kann.


Anmelden zum Antworten